2016-11-30 106 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. 從節點複製到此數組並返回後者。