首页 > 解决方案 > 带有过滤器链接的 ParallelStream

问题描述

如果我使用而不是filter链接会改变结果吗?parallelStream()stream()

我尝试了几千条记录,并且在几次迭代中输出看起来是一致的。但是由于这涉及线程,(而且我找不到足够的相关材料来讨论这种组合)我想加倍确保并行流不会以任何方式影响过滤器链接的输出。示例代码:

List<Element> list = myList.parallelStream()
      .filter(element -> element.getId() > 10)
      .filter(element -> element.getName().contains("something"))
      .collect(Collectors.toList());

标签: javajava-8java-streamfiltering

解决方案


简短的回答:

记录的filter操作期望一个非干扰无状态的谓词应用于每个元素,以确定它是否应该作为新流的一部分包含在内。

您应该考虑的几个方面是 -

  1. 除了并发集合(您 myList在现有代码中选择什么) -

对于大多数数据源来说,防止干扰意味着确保数据源在流管道执行过程中完全不被修改。

  1. 数据源的状态(myList以及它element在您的过滤器操作中的 s 没有变化)

另请注意,尝试从行为参数访问可变状态会给您带来安全和性能方面的错误选择;

此外,请考虑一下,您的filter操作中会受到多线程影响的内容是什么。给定当前代码,没有任何功能,只要执行这两个操作,无论执行它们的线程如何,您都会获得一致的结果。


推荐阅读