Parallel Stream提供null项,如何在Java 8中完成

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

selectedHashSet<Integer>在此操作期间未修改的.

somethingSubGroupDTO.addFilterDTO是一个辅助函数,它添加到一个不同步的List.这就是问题.作为一个非同步列表,我在列表中获得的项目少于预期,有些项目为空.如果我将其转换为同步列表,它可以工作.显然,将锁争用添加到并行流并不理想.

在高级别,我知道可以这样做,即每个流将自己进行处理,当它们加入时,它们将聚合.(至少我可以想象这样一个没有锁争用的进程)但是因为我是Java 8流处理的新手,所以我不知道怎么做.如何在没有单点争用的情况下执行相同的操作?

Tun*_*aki 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对象中,而不是一次添加一个项目.