2017-08-30 47 views
7

我是Java 8的新手。我正在學習流API的reduce方法。我看到一個奇怪的行爲與此代碼:爲什麼reduce合併器功能沒有執行?

public class PrdefinedCollectors { 
    public static void main(String[] args) { 
     Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6); 
     List<Integer> dataHolder = new ArrayList<Integer>(); 
     List<Integer> numbers = stream.reduce(dataHolder, 
      (List<Integer> dataStore, Integer data) -> { 
        System.out.println(data + " ->: " + dataStore); 
        dataStore.add(data); 
        return dataStore; 
       }, 
      (List<Integer> listOne, List<Integer> listTwo) -> { 
        System.out.println("ListOne Data :" + listOne + " List Two data :" + listTwo); 
        listOne.addAll(listTwo); 
        return listOne; 
       }); 

     System.out.println(numbers); 
    } 
} 

輸出:

1 ->: [] 
2 ->: [1] 
3 ->: [1, 2] 
4 ->: [1, 2, 3] 
5 ->: [1, 2, 3, 4] 
6 ->: [1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5, 6] 

我的問題是,爲什麼合併功能不執行真諦,爲什麼這條線:

System.out.println("List One Data: " + listOne + " List Two data: " + listTwo); 

.. .is沒有執行?

回答

9

這是因爲您沒有使用parallelStream()

A combiner只有要求並行流。

但是,這是不是在你的代碼的唯一問題,reduce是假設與不變數據進行工作 - 你的代碼,它是現在的樣子,會爲並行流失敗。這會爲collect的工作,但對於reduce你需要將其更改爲:

List<Integer> numbers = stream 
      .parallel() 
      .reduce(
        new ArrayList<>(), 
        (list, data) -> { 
         ArrayList<Integer> newList = new ArrayList<>(list); 
         newList.add(data); 
         return newList; 
        }, 

        (left, right) -> { 
         ArrayList<Integer> newList = new ArrayList<>(left); 
         newList.addAll(right); 
         return newList; 
        }); 
+0

多虧了它! – vicky

+2

重寫了你的答案,使其更加清晰。你知道如何做撤銷,以防你不喜歡我的改變。 – GhostCat