Java 8:我们可以使用MAP在流中制作实例方法REF



我正在尝试将某些代码重构为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个参数contextsubjectAreaCode

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();

最新更新