2017-09-03 48 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)的突变。