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 次 |
最近记录: |