Java 8方法参考:如何确定采用哪种方法?

Mul*_*ard 6 java java-8

可以说我们有以下课程:

public class NameCreator {

    public String createName(String lastname) {
        return lastname;
    }

    public String createName(String lastname, String firstName) {
        return lastname + " " + firstname
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我想通过Java 8方法引用它:

NameCreator::createName
Run Code Online (Sandbox Code Playgroud)

我会得到错误:

Cannot resolve method createName
Run Code Online (Sandbox Code Playgroud)

如何定义我想要调用哪些方法?

Mic*_*ael 11

NameCreator::createName意味着该方法是静态的(下表中的种类#1),或者功能接口目标也采用该类的实例(例如,种类#3
BiFunction<NameCreator, String, String>).你的方法不是静态的,所以你的目标可能不会占用实例,这就是你得到"无法解决方法"错误的原因.您可能希望在实例(种类#2)上使用方法引用.在课堂上,您可以使用:

Function<String, String> func = this::createName
Run Code Online (Sandbox Code Playgroud)

从课外,您可以使用:

NameCreator creator = new NameCreator();
Function<String, String> func = creator::createName;
Run Code Online (Sandbox Code Playgroud)

至于是使用单参数还是双参数版本,它取决于所针对的功能接口.上面将使用您的第一个方法,因为Function<String, String>接受一个String并返回一个String.作为示例,以下功能接口将使用您的第二种方法:

NameCreator creator = new NameCreator();
BiFunction<String, String, String> func = creator::createName;
Run Code Online (Sandbox Code Playgroud)

请参阅:Function,BiFunction和整个java.util.function

您可能还对方法引用的Java教程感兴趣,特别是这部分:


有四种方法参考:

Kind                                                   | Example
==============================================================================================
Reference to a static method                           | ContainingClass::staticMethodName
-------------------------------------------------------+--------------------------------------
Reference to an instance method of a particular object | containingObject::instanceMethodName
-------------------------------------------------------+--------------------------------------
Reference to an instance method of an arbitrary object | ContainingType::methodName
of a particular type                                   |
-------------------------------------------------------+--------------------------------------
Reference to a constructor                             | ClassName::new
==============================================================================================
Run Code Online (Sandbox Code Playgroud)