2016-11-30 44 views
3

我正在尝试使用Java 8流生成int[][]如何使用Java 8流生成2D 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[][]。请建议。

+0

你在寻找flatMap吗? – Eugene

+0

@Eugene不,不想扁化集合,而是想创建一个2d int数组。 –

+0

如何将Stream 转换为int [] []?你能提供例子吗?更好的向我们展示你的输入和期望的输出,目前还不清楚你想要做什么 – Eugene

回答

6

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

正如你所说你在map阶段后有Stream<int[]>阶段。然后,你只需要提供像数组发生器功能:

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]] 
+0

谢谢你的回答。我仍然需要等待几分钟才能接受它。有一个问题,我尝试为内部映射执行'toArray(int [] :: new)',而不是'.map(t-> t.getIndex())。mapToInt(i - > i).toArray ()',试过这个:'.map(t-> t.getIndex())。toArray(int [] :: new)',但它不起作用。任何想法为什么? –

+3

@SayanPal那么你有一个'Stream '这不能存储在int []'中。'Stream :: mapToInt'返回一个'IntStream',它提供一个'toArray'方法返回一个'int []'。这正是你需要的。 – Flown

3

你需要一个toArray(generator)方法,帮助我们通过IntFunction<T[]>功能来指定返回类型:

int[][] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(int[][]::new); 

而不是toArray(),它返回Object[]而不管中的传入类型(调用toArray(Object[]::new)内部):

Object[] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(); 

如果你有兴趣,在幕后,这一切具有以下外观:

  1. 形成Node [一个在我们的例子ArrayNode ](前一阶段的Pipeline)(一个用于保存有序元素序列的不可变容器);
  2. 使用节点大小计算数组大小(node.count());
  3. 通过我们的IntFunction<T[]>生成器(i -> new int[i][]或简单地int[][]::new)获取具有所需长度的新空阵列;
  4. 从节点复制到此数组并返回后者。