我有这个代码:
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
这是正确的
code b
显示了一个 int 类成员 comparisonResults.num_of_sub_responses==10
是正确结果的两倍。
java 8 reduce 应该是线程安全的,对吧?
我错过了什么吗?
getResponse
和compareToBl
是线程安全的
最佳答案
您正在改变 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/