【问题标题】:Cartesian product of two int arrays using Java 8 streams使用 Java 8 流的两个 int 数组的笛卡尔积
【发布时间】:2018-06-29 15:08:49
【问题描述】:

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

我想得到这两个数组的Cartesian product

当我使用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());

但是,当我使用 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());

请帮助我理解这里出了什么问题。

P。 S.

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

生成输出为{(10,11),(20,21),(30,31)}

【问题讨论】:

    标签: java integer java-stream


    【解决方案1】:

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

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

    但是 flatMap() 的 lambda 会产生 Stream&lt;int[]&gt;,并且您不能将 IntStream 隐式映射到 Stream
    而编译错误。
    所以首先将你的 IntStream 映射到 Stream&lt;Integer&gt;

    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&lt;Stream&lt;int[]&gt;&gt;,然后调用flatMap() 将其合并为&lt;Stream&lt;int[]&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-05
      • 2015-12-14
      • 2015-11-14
      • 2016-02-24
      • 2011-12-18
      • 2011-01-31
      相关资源
      最近更新 更多