java - 在 Java 8 中使用并行流时,对于相同的请求,我得到了不同大小的响应。任何人都可以提供有关如何处理此问题的见解吗?
问题描述
我的应用程序结构如下:调用服务类的控制器又调用存储库类。存储库(objectRepo)返回一个对象列表。服务类通过它从存储库获取的对象列表进行解析,并将其转换为 apiResponseWrapper 类。控制器将此 apiResponseWrapper 提供给用户而不更改它。
在我的服务类中,我的代码可以有效地转换为以下示例代码:
List<Object> objectList = objectRepo.getList(paramMap);
List<Entity> entityList = new ArrayList<>();
objectList.parallelStream().forEach(object->{
//code to transform object
entityList.add(transformedObject);
});
return entityList;
当像上面那样使用并行流时,我的 API 响应的大小在连续调用时会发生变化,具有完全相同的参数,并且在进一步检查中,某些实体在少数调用的响应中不存在。在删除 parallelStream 时,响应的大小保持不变,并且所有预期的实体都在结果中。
我想知道是否有任何特定的方式/任何一套指导方针可以帮助我在不丢弃任何数据的情况下使用并行流。
解决方案
不要那样做......使用:
List<Entity> entityList = objectList.stream()
.parallel()
.map(object -> transform to transformedObject)
.collect(Collectors.toList())
毕竟entityList
不是从多个线程更新的线程安全集合,文档中也不鼓励这样做,因为它是不必要的副作用。
此外,在极少数情况下parallel
可以提高性能,您需要大量对象才能产生任何有意义的效果。
推荐阅读
- export - 出口状态更改日期 odoo 8
- android - Android Kotlin - 淡出活动并设置持续时间
- sql-server - 在日期类型列中插入 UTC 日期
- javascript - EventListeners 获取带有标签的类
- python - python pathos - 主进程运行速度非常慢,子进程串行运行
- javascript - 在 API 数据旁边加载和显示本地图像
- stanford-nlp - OpenIE 是否提取西班牙语中的关系?
- google-ads-api - 自动标记 Google 广告网址
- angular - 角度http拦截器响应标头
- vb.net - 我无法比较我的文件,因为无法复制我不需要的文件的错误。为什么?