java - 带有过滤器链接的 ParallelStream
问题描述
如果我使用而不是filter
链接会改变结果吗?parallelStream()
stream()
我尝试了几千条记录,并且在几次迭代中输出看起来是一致的。但是由于这涉及线程,(而且我找不到足够的相关材料来讨论这种组合)我想加倍确保并行流不会以任何方式影响过滤器链接的输出。示例代码:
List<Element> list = myList.parallelStream()
.filter(element -> element.getId() > 10)
.filter(element -> element.getName().contains("something"))
.collect(Collectors.toList());
解决方案
简短的回答:不。
记录的filter
操作期望一个非干扰和无状态的谓词应用于每个元素,以确定它是否应该作为新流的一部分包含在内。
您应该考虑的几个方面是 -
- 除了并发集合(您
myList
在现有代码中选择什么) -
对于大多数数据源来说,防止干扰意味着确保数据源在流管道执行过程中完全不被修改。
- 数据源的状态(
myList
以及它element
在您的过滤器操作中的 s 没有变化)
另请注意,尝试从行为参数访问可变状态会给您带来安全和性能方面的错误选择;
此外,请考虑一下,您的filter
操作中会受到多线程影响的内容是什么。给定当前代码,没有任何功能,只要执行这两个操作,无论执行它们的线程如何,您都会获得一致的结果。
推荐阅读
- python - 将循环中的 DF 保存为 Python 中的全局 DF
- ksqldb - KSQL 中的 Collect_LIST 规范
- html - 链接到同一页面中的其他部分不起作用
- c# - 如何在 C# 中将一些值从第一类发送到第二类?
- elasticsearch - 如何在 Low Level Rest Client API 中编写 Match_all 搜索查询
- docker - Kubernetes - dockerd 高 CPU 使用率
- dataweave - 如何在mule中将输入json数组转换为csv
- mysql - SELECT 行,即使 JOIN 失败
- docusignapi - docusign 是否向收件人提供“上传签名”选项?
- javascript - 如何在 AngularJS 组件中创建谷歌地图?