我正在尝试将某些代码重构为Java 8.以下是我的代码。
for (SubjectAreaMappings pageFromEnum : SubjectAreaMappings.values()) {
if (page.equals(pageFromEnum.toString())) {
for (SubjectAreaCode subjectAreaCode : pageFromEnum.getCodes()) {
list.addAll(areaDAO.getData(context, subjectAreaCode));
}
}
}
我正在尝试将内部for
循环重构为以下代码之类的内容,但是我应该使用的是map()
还是reduce()
?如何通过2个参数context
和subjectAreaCode
?
Arrays.asList(pageFromEnum.getCode()).stream().map(somethng wrt method ref here).collect(toList())
reduce()
不是map()
的替代方案。它是collect()
的替代方法。在您的示例中,您将处理的元素收集到List
,因此应使用collect()
。
您不能将显式参数传递给方法参考。因此,您应该在这种情况下使用lambda表达式:
Arrays.asList(pageFromEnum.getCodes()).stream().map(code -> areaDAO.getData(context, code)).collect(toList());
顺便说一句,您的Stream
管道似乎仅代替内部循环。您可以编写Stream
管道来替换外部和内部循环:
list =
Arrays.stream(SubjectAreaMappings.values())
.filter(s -> page.equals(s.toString()))
.flatMap(s -> Arrays.stream(s.getCodes())
.map(code -> areaDAO.getData(context, code)))
.collect(toList());
这是streamex的一个短的代码:
StreamEx.of(subjectAreaMappings.values())
.filter(p -> page.equals(p.toString()))
.flatMap(p -> StreamEx.of(p.getCodes()))
.flatMap(c -> StreamEx.of(areaDAO.getData(context, c)))
.toList();
如果areaDAO.getData
是数据库访问,则在此处使用并行流:
StreamEx.of(subjectAreaMappings.values())
.filter(p -> page.equals(p.toString()))
.flatMap(p -> StreamEx.of(p.getCodes()))
.parallel()
.flatMap(c -> StreamEx.of(areaDAO.getData(context, c)))
.toList();