Декартово произведение двух внутренних массивов с использованием потоков Java 8

У меня есть два массива int a = {10,20,30}и {1,2,3}.

Я хотел бы получить декартово произведение этих двух массивов.

При использовании Listв Integerсек логика работает отлично:

    List<Integer> intList = Arrays.asList(10,20,30);
    List<Integer> intList1 = Arrays.asList(1,2,3);
    intList.stream().flatMap(i -> intList1.stream().map(j -> new int[]{i,j})).collect(Collectors.toList());

Однако, когда я использую int[], я получаю ошибку компиляции.

Ошибка: (16, 79) java: несовместимые типы: неправильный тип возврата в лямбда-выражении нет экземпляров (-ов) переменных типа, которые существуют, так что java.util. int [] intArray = { 10 , 20 , 30 }; int [] intArray1 = { 1 , 2 , 3 }; Массивы . stream ( intArray ). flatMap ( i -> Arrays . stream ( intArray1 ). mapToObj ( j -> new int [] { j , i })). collect ( Collectors . toList ()); .Stream соответствует java.util.stream. Массивы . stream ( intArray ). mapToObj ( i -> new int [] { i , i + 1 }). collect ( Collectors . toList ());

{(10,11),(20,21),(30,31)}

Пожалуйста, помогите мне понять, что здесь не так.

PS

Arrays.stream(intArray)

Производит вывод, как IntStream.

java,integer,java-stream,

4

Ответов: 1


8 ов

Во втором случае flatMap()возвращает a . Поэтому ожидается, что параметр - это поток, совместимый с:Arrays.stream(intArray) .flatMap(i -> Arrays.stream(intArray1) .mapToObj(j -> new int[] { j, i }))
flatMap()

Stream<int[]>

Но lambda IntStreamпроизводит a, Streamи вы не можете сопоставить a IntStreamс Streamнеявным образом.
В то время как ошибка компиляции.
Так первая карта вашего Stream<Integer>To :List<int[]> collect = Arrays.stream(intArray) .boxed() .flatMap(i -> Arrays.stream(intArray1) .mapToObj(j -> new int[] { j, i })) .collect(Collectors.toList());

List

Он менее эффективен, чем ваше первоначальное намерение (из-за целостного бокса), но он будет работать.
Обратите внимание, что в общем случае вам нужно избегать создания массива. Они не предназначены для совместной работы. это правда в целом и для потоков тоже. List<int[]> collect = Arrays.stream(intArray) .mapToObj(i -> Arrays.stream(intArray1) .mapToObj(j -> new int[] { j, i })) .flatMap(Function.identity()) .collect(Collectors.toList());

редактировать

Решение Holger, предоставленное в качестве комментария, предотвращает бокс:

IntStream

Он сначала отображает IntStreama, Stream<Stream<int[]>>а затем flatMap()вызывается, чтобы объединить его в a <Stream<int[]>.

Java, целое число, Java-поток,
Похожие вопросы
Яндекс.Метрика