作者:JJ关键词 | 来源:互联网 | 2022-12-12 11:09
我有两个int数组,a = {10,20,30}
和{1,2,3}
.
我想获得这两个阵列的笛卡尔积.
当我使用List
的Integer
S中的逻辑正常工作:
List intList = Arrays.asList(10,20,30);
List 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:不兼容类型:lambda表达式中的错误返回类型没有变量类型的实例U存在以便java.util.stream.Stream符合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());
请帮我理解这里有什么问题.
PS
Arrays.stream(intArray).mapToObj(i -> new int[]{i,i+1}).collect(Collectors.toList());
产生出局, {(10,11),(20,21),(30,31)}
.
1> davidxxx..:
在第二种情况下,Arrays.stream(intArray)
返回一个IntStream
.
因此, flatMap()
期望作为参数的流兼容:
Arrays.stream(intArray)
.flatMap(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
但lambda flatMap()
产生a Stream
并且你无法隐式映射IntStream
到a Stream
.
而编译错误.
首先将您的地图映射IntStream
到Stream
:
List collect =
Arrays.stream(intArray)
.boxed()
.flatMap(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
.collect(Collectors.toList());
它的效率低于你的初始意图(因为整数拳击),但它会起作用.
请注意,通常,您必须避免创建List
数组.这些不是为了一起工作而设计的.
一般来说都是如此,对于溪流来说也是如此.
编辑
作为评论提供的Holger解决方案可以防止拳击:
List collect = Arrays.stream(intArray)
.mapToObj(i -> Arrays.stream(intArray1)
.mapToObj(j -> new int[] { j, i }))
.flatMap(Function.identity())
.collect(Collectors.toList());
它首先映射IntStream
到a Stream>
然后flatMap()
被调用以将其合并为a
.