我有这个代码:
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 应该是线程安全的,对吧?
我错过了什么吗?
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/