我有这个java代码 取字符串(请求)获取http响应 - >将其传递给与内存中保存的旧响应进行比较。
我想在结果对象
中收集n个比较结果最终我想将m个报表对象聚合到一个对象中。
我有这段代码
但我不确定我是否正在做第二个功能
我应该每次创建新报告吗?
该机制如何运作?
Report report = requestsList
.parallelStream()
.map(request ->
getResponse(request, e2EResultLongBL, e2EResultLongFresh)
)
.map(response -> compareToBl(response, e2EResultLongBL))
.reduce(null,
(sumReport, compare2) ->
{
if (sumReport == null)
{
sumReport = new Report();
}
sumReport.add(compare2);
return sumReport;
},
(report1, report2) ->
{
Report report3 = new Report();
report3.add(report2);
return report3;
});
修改
我尝试过“收集”而不是“减少”
我收到了这个错误:
Error:(174, 21) java: no suitable method found for collect(<nulltype>,(sumReport[...]rt; },(report1,r[...]t3; })
method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super com.waze.routing.automation.dataModel.ComparisonResult>,java.util.function.BiConsumer<R,R>) is not applicable
(cannot infer type-variable(s) R
(argument mismatch; unexpected return value))
method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super com.waze.routing.automation.dataModel.ComparisonResult,A,R>) is not applicable
(cannot infer type-variable(s) R,A
(actual and formal argument lists differ in length))
答案 0 :(得分:1)
你绝对想要一个收藏家。您将按并行执行创建报告,将单个比较添加到报告中,然后将这些报告与最终功能合并。
无需在组合器上创建新报告。只需添加2比1。
.collect(Collector.of(
() -> new Report(),
(report, compare2) -> {
report.add(compare2);
return report;
},
(report1, report2) -> {
report1.add(report2);
return report1;
});
另外,如果你想使代码更干净,可以使用add函数return this;
你可以用函数引用替换lambdas。
.collect(Collector.of(Report::new, Report::add, Report::add));