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

标签 java integer java-stream

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

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

当我使用 IntegerList 时,逻辑工作正常:

    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[]>你不能映射 IntStreamStream含蓄地。
而编译错误。
所以首先映射你的 IntStreamStream<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());

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

关于java - 使用 Java 8 流的两个 int 数组的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51104721/

相关文章:

java - 如何使用 Java 中的 Collectors 聚合多个字段

java - 在 Java 中比较两个声音(有容差)

java - 打印字符串 'X' 次(无循环)

c - 值为20,10000,出现错误

python - 如何给包含字母的字符串加+1?

java - 将流转换为列表

Java-Stream - Java 11 中基于聚合计数的分组和排序

Java 不使用信任库

java - Play 2.1.1 构建依赖

database - 主键的 INT 与 VARCHAR 数据类型