Оператор Arithmeti c нельзя применить к IntStream - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть метод, который принимает ArrayList из int[] массивов. Если я вызываю метод с ArrayList из одного int[] массива, он должен просто вернуть разницу между двумя значениями в массиве int []. Используя потоковую передачу, я получил

static int difference(ArrayList<int[]> stops) {
    return stops.stream().map(Arrays::stream).reduce((a, b) -> (a - b)).get();
}

Хотя я получаю ошибку компилятора, говорящую:

Operator '-' cannot be applied to 'java.util.stream.IntStream', 'java.util.stream.IntStream'

Насколько я понимаю, этот метод превращает список в поток int[] массивов Затем каждый поток int[] передается в IntStream, пока, наконец, не будет вызван метод reduce().

Что я не понимаю, так это то, что когда у меня есть код, подобный следующему:

IntStream.of(1, 2).reduce((a, b) -> a - b));

Я не получаю ошибок компилятора. Итак, я спрашиваю: что не так с первым кодом, который заставляет компилятор выдавать эту ошибку? Потому что мне кажется, что оба метода Reduce принимают IntStream.

Редактировать: в решении, которое я решаю, указан каждый массив int[], который будет содержать ровно 2 элемента. Как только разница между двумя элементами в массиве int[] достигнута, ее следует направить на окончательное уменьшение, чтобы получить абсолютное значение разности уменьшенных int s из каждого массива `int [].

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Я собрал следующее UT и попытался имитировать c того, что вы пытались выполнить sh

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

import static junit.framework.TestCase.assertEquals;



public class IntStreamTest {

    int basicDifference() {
        return stops.stream().reduce(0, (a,b) -> a - b).intValue();
    }    

    @Test
    public void test() {
        List<Integer> stops = Arrays.asList(1, 2, 3, 4, 5);

        int result = basicDifference(stops);

        assertEquals(result, -15);
    }


    int difference(List<int[]> stops) {
         return stops.stream().flatMapToInt(Arrays::stream).reduce(0,(a,b) -> (a-b));
    }

    @Test
    public void given_a_list_of_two_arrays_when_the_list_is_reduced_the_difference_of_all_values_is_made() {
        int result = difference(Arrays.asList(new int[]{1,2,3}, new int[]{4,5,6}));

        assertEquals(-21, result);
    }

    @Test
    public void given_a_list_of_one_array_when_the_list_is_reduced_the_difference_of_all_values_is_made() {
        int result = difference(Arrays.asList(new int[]{1,2,3}));

        assertEquals(-6, result);
    }
}

Так что это работает так, как я ожидал, это будет работать, начиная с 0 и разница остальных целых чисел. Так что в этом случае 0-1-2-3-4-5= -15 - в случае метода basicDifference (). В разностном методе я использовал входные данные, которые были на самом деле в начальном запросе, мы можем использовать плоскую карту, чтобы разместить весь контент в одном месте, тем более что мы сократили его в два раза. В УЦ видно, как оно используется.

1 голос
/ 14 апреля 2020

stops.stream().map(Arrays::stream) - это Stream<IntStream>, поэтому, когда вы пытаетесь уменьшить его, вы не можете применить оператор - к двум IntStream его элементам.

IntStream.of(1, 2) - это IntStream, поэтому, когда вы пытаетесь уменьшить его, вы можете применить - оператор двух int его элементов.

Непонятно, как вы sh уменьшите свой Stream<IntStream> до одного int. Вы указали, как вы будете sh уменьшать каждый из IntStream с до int, но как бы вы уменьшили итоговые int с до одного int?

Вы можете уменьшить IntStream элементов вашего Stream<IntStream>, чтобы получить Stream<Integer>:

Stream<Integer> si = stops.stream()
                          .map(ar -> Arrays.stream(ar)
                                           .reduce((a, b) -> (a - b))
                                           .getAsInt ());

Затем вы должны решить, что вы будете sh делать с элементами этого Stream.

...