如何在 Java 8 流 api 中实现不变性

how to achieve immutability in Java 8 stream api

考虑以下代码。我读到在处理 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 元素。

使用 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 已经是不可变的(toLowerCase 在必要时生成一个新的 String)并且原始的 List (stockList) 不会因创建输出 List (stockList2).