我有两个 int 数组,a = {10,20,30}
和 {1,2,3}
。
我想得到 Cartesian product这两个数组。
当我使用 Integer
的 List
时,逻辑工作正常:
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[]
时,出现编译错误。
Error:(16, 79) java: incompatible types: bad return type in lambda expression no instance(s) of type variable(s) U exist so that java.util.stream.Stream conforms to java.util.stream.IntStream
int[] intArray = {10,20,30};
int[] intArray1 = {1,2,3};
Arrays.stream(intArray).flatMap(i -> Arrays.stream(intArray1).mapToObj(j -> new int[]{j,i})).collect(Collectors.toList());
请帮助我了解这里出了什么问题。
P. S.
Arrays.stream(intArray).mapToObj(i -> new int[]{i,i+1}).collect(Collectors.toList());
将输出生成为 {(10,11),(20,21),(30,31)}
。
最佳答案
在第二种情况下,Arrays.stream(intArray)
返回 IntStream
.
所以flatMap()
期望作为参数的流兼容:
Arrays.stream(intArray)
.flatMap(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
但是 flatMap()
的 lambda产生 Stream<int[]>
你不能映射 IntStream
到 Stream
含蓄地。
而编译错误。
所以首先映射你的 IntStream
至 Stream<Integer>
:
List<int[]> collect =
Arrays.stream(intArray)
.boxed()
.flatMap(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
.collect(Collectors.toList());
它的效率低于您的初衷(因为整数装箱),但它会起作用。
请注意,通常,您必须避免创建 List
的阵列。这些设计不能很好地协同工作。
一般而言,对于流也是如此。
编辑
作为评论提供的 Holger 解决方案可防止装箱:
List<int[]> collect = Arrays.stream(intArray)
.mapToObj(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
.flatMap(Function.identity())
.collect(Collectors.toList());
它首先映射IntStream
到 Stream<Stream<int[]>>
然后 flatMap()
被调用以将其合并为 <Stream<int[]>
.
关于java - 使用 Java 8 流的两个 int 数组的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51104721/