我正在查看一个深深嵌套于for循环中的代码,我想使用java-8流以纯函数形式重写该代码,但是我看到的是每个级别都需要多个值,而且我不确定如何解决这个问题的方法。
List<Report> reports = new ArrayList();
for (DigitalLogic dl : digitalLogics){
for (Wizard wiz : dl.getWizards){
for(Vice vice : wiz.getVices()){
reports.add(createReport(dl, wiz, vice));
}
}
}
//
Report createReport(DigitalLogic dl, Wizard wiz, Vice vice){
//Gets certain elements from all parameters and creates a report object
}
我的实际情况比这要复杂得多,但是我想知道是否存在使用流编写此内容的更简洁的纯功能方法。以下是我最初的尝试
List<Report> reports = new ArrayList();
digitalLogics.stream()
.map(dl -> dl.getWizards())
.flatMap(List::stream())
.map(wiz -> wiz.getVices())
.flatMap(List::stream())
.forEach(vice -> reports.add(createReport(?, ?, vice));
显然,我已经失去了DigitalLogic和Wizard参考。
最佳答案
我将使用forEach
方法,因为stream
解决方案使这一过程变得复杂
List<Report> reports = new ArrayList<>();
digitalLogics.forEach(dl->dl.getWizards()
.forEach(wiz->wiz.getVices()
.forEach(v->reports.add(createReport(dl, wiz, v)))));