首页 > 解决方案 > 在 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 时,响应的大小保持不变,并且所有预期的实体都在结果中。

我想知道是否有任何特定的方式/任何一套指导方针可以帮助我在不丢弃任何数据的情况下使用并行流。

标签: javalambdajava-8

解决方案


不要那样做......使用:

List<Entity> entityList = objectList.stream()
          .parallel()
          .map(object -> transform to transformedObject)
          .collect(Collectors.toList())

毕竟entityList不是从多个线程更新的线程安全集合,文档中也不鼓励这样做,因为它是不必要的副作用。

此外,在极少数情况下parallel可以提高性能,您需要大量对象才能产生任何有意义的效果。


推荐阅读