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
是线程安全的
你正在改变一个传入的对象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
合并函数,虽然它的名称有点误导.