Car*_*cas 5 java parallel-processing lambda java-8 java-stream
在尝试使用并行流时,我得到了一些奇怪的结果,我知道一种解决方法,但它似乎并不理想
// Create the set "selected"
somethingDao.getSomethingList().parallelStream()
.filter(something -> !selected.contains(something.getSomethingId()))
.forEach(something ->
somethingSubGroupDTO.addFilterDTO(
new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false))
);
selected.clear();
Run Code Online (Sandbox Code Playgroud)
somethingDao.getSomethingList 返回一个 List
selected是HashSet<Integer>在此操作期间未修改的.
somethingSubGroupDTO.addFilterDTO是一个辅助函数,它添加到一个不同步的List.这就是问题.作为一个非同步列表,我在列表中获得的项目少于预期,有些项目为空.如果我将其转换为同步列表,它可以工作.显然,将锁争用添加到并行流并不理想.
在高级别,我知道可以这样做,即每个流将自己进行处理,当它们加入时,它们将聚合.(至少我可以想象这样一个没有锁争用的进程)但是因为我是Java 8流处理的新手,所以我不知道怎么做.如何在没有单点争用的情况下执行相同的操作?
请勿使用forEach和收集您的Stream List:
somethingDao.getSomethingList().parallelStream()
.filter(something -> !selected.contains(something.getSomethingId()))
.map(something -> new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false))
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
然后,您可以将返回的列表直接设置到somethingSubGroupDTO对象中,而不是一次添加一个项目.
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |