使用方法引用替换链式方法调用

Maj*_*imi 3 java lambda java-8

"Java 8 Lambdas:实用功能编程"有一个peekStreamAPI中使用方法的例子.这段代码打印名称以"The"开头的艺术家国籍:

Set<Nationality> nationalities = album.getMusician()
                                 .filter(artist -> artist.getName().startsWith("The"))
                                 .map(artist -> artist.getNationality())
                                 .peek(nation -> System.out.println(nation))
                                 .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我想用方法引用重写此代码:

Set<Nationality> nationalities = album.getMusician()
                                 .filter(artist -> artist.getName().startsWith("The"))
                                 .map(Artist::getNationality)
                                 .peek(System.out::println)
                                 .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

有没有重写的解决方案filter(artist -> artist.getName().startsWith("The"))

ass*_*ias 6

您需要创建一个单独的方法,该方法接受一个Artist并返回一个布尔值:

private boolean nameStartsWithThe(Artist a) {
    return a.getName().startsWith("The");
}

Set<Nationality> nationalities = album.getMusician()
                                 .filter(this::nameStartsWithThe)
Run Code Online (Sandbox Code Playgroud)

或使用静态方法:

private static boolean nameStartsWithThe(Artist a) {
    return a.getName().startsWith("The");
}

Set<Nationality> nationalities = album.getMusician()
                                 .filter(MyClass::nameStartsWithThe)
Run Code Online (Sandbox Code Playgroud)