java - 在 Java 8 中使用并行流时,我对同一请求得到不同大小的响应。任何人都可以提供有关如何处理此问题的见解吗?

标签 java lambda java-8

我的应用结构如下: 调用服务类的 Controller 又调用存储库类。 存储库(objectRepo)返回一个对象列表。 服务类通过从存储库获取的对象列表进行解析,并将其转换为 apiResponseWrapper 类。 Controller 将此 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;

当像上面那样使用 parallelstream 时,我的 API 的响应大小在连续调用时会有所不同,参数完全相同,并且在进一步检查时,某些实体在少数这些调用的响应中不存在。删除 parallelStream 后,响应的大小保持不变,并且所有预期的实体都在结果中。

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

最佳答案

不要那样做...使用:

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

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

此外,在极少数情况下并行 会提高性能,您需要很多 对象才能产生任何有意义的效果。

关于java - 在 Java 8 中使用并行流时,我对同一请求得到不同大小的响应。任何人都可以提供有关如何处理此问题的见解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52053875/

相关文章:

c++ - 为什么这段代码会出现 "exception spec is more lax than base"错误?

java - 什么是 NullPointerException,我该如何解决?

java - Google Documents List Api - 没有 feed.getNextLink() 的分页结果

java - 使用套接字服务器/客户端传输文件

c++ - 从 lambda 返回的对象丢失属性值

c++ - 如何通过索引递增的generate_n填充STL容器

java-8 - Nashorn 中的枚举强制与 Rhino 中的工作方式不同

java - Java 8中通过串口发送和接收数据的多平台方式?

java - Android - 定义微调器中显示的值(与所选值不同)

Java 8 流 - 合并映射并计算 "values"的平均值