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

标签 java java-8 java-stream immutability

考虑以下代码。我读到在处理 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()将元素添加到 Listmap()应该转变 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/

相关文章:

java - 将 Set<String> 中的所有值分配给带有流的 Map<String, String>

java - 为什么 Files.list() 并行流的执行速度比使用 Collection.parallelStream() 慢得多?

java - 如何将所有必需的 jar 放入最后一个 jar 中?

java - 使用 Guice 注入(inject) Swing 组件的最佳实践?

java - 为什么我添加到项目中的计时器类在单击按钮时没有启动?

java - 比较映射和列表时如何将 Java 7 重构为 Java 8

java - 如何强制在每个测试方法中运行静态 block ?

java - 如何像grep一样从java 8流匹配前后获取行?

java - Java排序时如何考虑末尾空格

java - 如何将流与干扰方法和构造函数一起使用,为什么不使用 .peek()?