我有这个代码:

        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);
                });

这个代码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);
                });

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

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

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

我错过了什么吗?
getResponsecompareToBl 是线程安全的

最佳答案

您正在改变 reduce 中的传入对象。这是错误的。在修改传入对象后创建新对象并没有帮助。

你想做的是

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

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

您应该仔细阅读 “Reduction” chapter of the documentation 及其后续内容“可变归约”。

关于java - 为什么 Java 流映射将我的结果计数减少了两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33375335/

10-12 23:01