【问题标题】:java 8 stream interference versus non-interferencejava 8流干扰与非干扰
【发布时间】:2014-07-19 15:26:18
【问题描述】:

我明白为什么下面的代码没问题。因为调用终端操作之前正在修改集合。

List<String> wordList = ...;
Stream<String> words = wordList.stream();
wordList.add("END"); // Ok
long n = words.distinct().count();

但是为什么这段代码不行呢?

Stream<String> words = wordList.stream();
words.forEach(s -> if (s.length() < 12) wordList.remove(s)); // Error—interference

【问题讨论】:

    标签: java-8 java-stream


    【解决方案1】:

    Stream.forEach()是终端操作,在终端启动/调用后修改底层wordList集合。

    【讨论】:

    • 谢谢。我不知道这是一个终端操作。
    【解决方案2】:

    Joachim's answer 是正确的,+1。

    您没有特别问,但为了其他读者的利益,这里有一些技术可以用不同的方式重写程序,避免流干扰问题。

    如果您想就地改变列表,您可以在List 上使用新的默认方法而不是使用流:

    wordList.removeIf(s -> s.length() < 12);
    

    如果您想保持原始列表不变但创建修改后的副本,您可以使用流和收集器来做到这一点:

    List<String> newList = wordList.stream()
        .filter(s -> s.length() >= 12)
        .collect(Collectors.toList());
    

    请注意,我必须颠倒条件的含义,因为filter 采用一个谓词,如果条件为真,则 保留 流中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 2015-02-09
      • 2012-07-17
      • 2019-06-17
      • 2015-02-12
      相关资源
      最近更新 更多