如何使用Java 8流生成2D int数组?

时间:2016-11-30 13:54:34

标签: java java-8 java-stream

我正在尝试使用Java 8流生成int[][]

这是我到目前为止所做的:

objects.parallelStream()
            .map(o -> o.getPropertyOnes()
                    .parallelStream()
                    .map(t-> t.getIndex())  //<-- getIndex() returns int
                    .mapToInt(i -> i)
                    .toArray())            //<-- here I have a Stream<int[]>
            .toArray();                   //lost here

在外部.map()的末尾,我有一个Stream<int[]>,但不知道如何将其转换为int[][]。请建议。

3 个答案:

答案 0 :(得分:6)

首先,您可以将map().mapToInt()简化为mapToInt(t-> t.getIndex())(也许您应该使用<type>::getIndex之类的方法参考。

如你所说,Stream<int[]>阶段之后你有map。然后你只需要提供一个数组生成器函数,如:

int[][] array = Stream.of(1, 2, 3, 4)
                      .map(i -> IntStream.range(0, i).toArray())
                      .toArray(int[][]::new);

输出:

[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]

答案 1 :(得分:3)

您需要toArray(generator)方法帮助我们通过 List<Dictionary> dictList = dictService.findAllDictionaries(); model.addAttribute("dictionary", new Dictionary()); model.addAttribute("dictList", dictList); Neither BindingResult nor plain target object for bean name 'dict' available as request attribute 函数指定返回类型:

IntFunction<T[]>

而不是toArray(),它返回int[][] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(int[][]::new); 而不管Object[]中的传入类型(在内部调用Stream):

toArray(Object[]::new)

如果您对幕后感兴趣,所有这些都具有以下外观:

  1. 在我们的案例中形成Object[] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(); [an Node(用于保持有序元素序列的不可变容器)来自前一阶段的ArrayNode;
  2. 使用节点大小(Pipeline);
  3. 计算数组大小
  4. 我们的node.count()生成器(IntFunction<T[]>或简称i -> new int[i][])获取所需长度的新空数组;
  5. 从节点复制到此阵列并返回后者。

答案 2 :(得分:0)

如果要生成n个n个连续数字的2D数组,其中度数为n。

int n = 4;
System.out.println(Arrays.deepToString(IntStream.rangeClosed(0, n - 1)
        .boxed().map(x -> IntStream.rangeClosed(x * n + 1, (x + 1) * n)
            .boxed().toArray()).toArray()));

Output: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]