为什么Java流映射减少了两次我的结果?

Ela*_*da2 3 java reduce java-8 java-stream

我有这个代码:

        ComparisonResults comparisonResults = requestsList
                .stream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });
Run Code Online (Sandbox Code Playgroud)

这个代码b:

        ComparisonResults comparisonResults = requestsList
                .parallelStream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });
Run Code Online (Sandbox Code Playgroud)

我所做的就是创建响应对象,然后将它们转换为comaprisonResult对象并将它们减少为一个comaprisonResult.

代码a显示了一个comparisonResults.num_of_sub_responses==5正确的int类成员

代码b显示了一个int类成员comparisonResults.num_of_sub_responses==10,它是正确结果的两倍.

java 8 reduce应该是线程安全的吧?

我错过了什么吗?

getResponse并且compareToBl是线程安全的

Hol*_*ger 7

你正在改变一个传入的对象reduce.这是错的.修改传入对象创建新对象没有任何帮助.

你想做什么,是

.collect(ComparisonResults::new, ComparisonResults::addSingleResult,
         (a,b)->/* code to merge two ComparisonResults instances*/);
Run Code Online (Sandbox Code Playgroud)

如果结果.map(item -> compareToBl(item))ComparisonResults或者,换句话说,addSingleResult合并两个ComparisonResults实例,你可以使用ComparisonResults::addSingleResult合并函数,虽然它的名称有点误导.

您应该仔细阅读文档及其后续"可变缩减" 的"缩减"章节.