考虑以下代码。我读到在处理 Stream 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);
最佳答案
您不应该使用map()
将元素添加到 List
。 map()
应该转变 Stream
一种类型的元素到 Stream
另一种类型的元素。
使用List
返回者 collect(Collectors.toList())
:
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
)和原始 List
( stockList
) 不会因输出 List
的创建而改变(stockList2
)。
关于java - 如何在 Java 8 流 api 中实现不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021599/