2017-09-03 60 views
1

請考慮以下代碼。我認爲在處理Stream API時,在代碼中實現不可變性非常重要。我們怎樣才能得到一個不變性小寫字母的清單?如何在Java 8流api中實現不變性

List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC"); 
    List<String> stockList2 = new ArrayList<>(); 
    stockList.parallelStream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .map(e -> stockList2.add(e)) 
      .collect(toList()); 
    stockList2.forEach(System.out::println); 
+0

字符串是一個不可變的,所以你在那裏覆蓋stockList2持有從stockList的字符串創建的新字符串 – urag

+1

不是你問的問題,但一般來說你應該謹慎使用ParallelStream(在簡單情況下,開銷將大於好處) –

+3

目前尚不清楚您在此方面的不變性。請澄清。 – shmosel

回答

14

你不應該使用map()來添加元素的List。假設map()將一種類型的元素的Stream變換爲另一種類型的元素的Stream

使用由collect(Collectors.toList())返回的List

List<String> stockList2 = 
    stockList.stream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .collect(Collectors.toList()); 
stockList2.forEach(System.out::println); 

您還沒有變異的任何對象。的String s爲已經不可變的(toLowerCase產生一個新的String如果必要的話)和原始ListstockList)不通過產生輸出ListstockList2)的突變。