Во втором случае 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
Он сначала отображает IntStream
a, Stream<Stream<int[]>>
а затем flatMap()
вызывается, чтобы объединить его в a <Stream<int[]>
.