使用Java 8流的两个int数组的笛卡尔积

jeg*_*esh 4 java integer java-stream

我有两个int数组,a = {10,20,30}{1,2,3}.

我想获得这两个阵列的笛卡尔积.

当我使用ListIntegerS中的逻辑正常工作:

    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());
Run Code Online (Sandbox Code Playgroud)

但是,当我使用时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());
Run Code Online (Sandbox Code Playgroud)

请帮我理解这里有什么问题.

PS

Arrays.stream(intArray).mapToObj(i -> new int[]{i,i+1}).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

产生出局, {(10,11),(20,21),(30,31)}.

dav*_*xxx 9

在第二种情况下,Arrays.stream(intArray)返回一个IntStream.
因此, flatMap()期望作为参数的流兼容:

Arrays.stream(intArray)
      .flatMap(i -> Arrays.stream(intArray1)
                     .mapToObj(j -> new int[] { j, i }))
Run Code Online (Sandbox Code Playgroud)

但lambda flatMap()产生a Stream<int[]>并且你无法隐式映射IntStream到a Stream.
而编译错误.
首先将您的地图映射IntStreamStream<Integer>:

List<int[]> collect = 
Arrays.stream(intArray)
      .boxed()
      .flatMap(i -> Arrays.stream(intArray1)
                          .mapToObj(j -> new int[] { j, i }))
      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

它的效率低于你的初始意图(因为整数拳击),但它会起作用.
请注意,通常,您必须避免创建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());
Run Code Online (Sandbox Code Playgroud)

它首先映射IntStream到a Stream<Stream<int[]>>然后flatMap()被调用以将其合并为a <Stream<int[]>.