Java8:我们可以使用map在流中创建实例方法ref吗?

Java8:我们可以使用map在流中创建实例方法ref吗?,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试将我的一些代码重构为Java8。是否可以将实例方法引用为在streams中使用map方法获取2个参数的方法?下面是我的代码 for (SubjectAreaMappings pageFromEnum : SubjectAreaMappings.values()) { if (page.equals(pageFromEnum.toString())) { for (SubjectAreaCode subjectAreaCode : pageFromEnum.get

我正在尝试将我的一些代码重构为Java8。是否可以将实例方法引用为在streams中使用map方法获取2个参数的方法?下面是我的代码

for (SubjectAreaMappings pageFromEnum : SubjectAreaMappings.values()) {
    if (page.equals(pageFromEnum.toString())) {
        for (SubjectAreaCode subjectAreaCode : pageFromEnum.getCodes()) {
            list.addAll(areaDAO.getData(context, subjectAreaCode));
        }
    }
} 
我试图将内部for循环重构为类似于以下代码的代码,但它是我应该使用的映射还是应该减少的映射?如何传递2个参数的上下文和subjectAreaCode

reduce不是map的替代品。这是一个收集的替代方案。在您的示例中,您正在将已处理的元素收集到一个列表中,因此应该使用collect

不能将显式参数传递给方法引用。因此,在此场景中应使用lambda表达式:

Arrays.asList(pageFromEnum.getCodes()).stream().map(code -> areaDAO.getData(context, code)).collect(toList());
顺便说一句,您的流管道似乎只替换内部for循环。您可以编写流管道来替换外部和内部循环:

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

下面是一段简短的代码:

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

@user3310115可以,但通常将流映射到IntStream并使用其内置的计数和求和方法更容易。@user3310115可以使用Arrays.Stream。@user3310115在这种情况下,可以使用第二个flatMap:change.mapcode->areaDAO.getDatacontext,code to.flatMapcode->areaDAO.getDatacontext,code.stream由于areaDAO.getData不引用s,因此不需要将映射步骤嵌套在其他lambda中。只需更改其中一个的位置,但可以消除额外的缩进,从而使代码更易于阅读。您可以编写EnumSet.allOfSubjectAreaMappings.class.stream来代替Arrays.streamSubjectAreaMappings.values来保存临时数组创建,但通常,enums只有几个常量,所以这没什么区别。
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();
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();