Java 8 方法引用 : how to determine which method to take?

标签 java java-8

假设我们有以下类:

public class NameCreator {

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

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

    ...
}

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

NameCreator::createName

我会得到错误:

Cannot resolve method createName

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

最佳答案

NameCreator::createName暗示该方法是静态的(下表中的类型#1),或者功能接口(interface)目标也采用类的实例(类型#3,例如
BiFunction<NameCreator, String, String> )。您的方法不是静态的,因此您的目标可能不会采用实例,这就是您收到“无法解析方法”错误的原因。您可能希望在实例(类型 #2)上使用方法引用。在类里面,您可以使用:

Function<String, String> func = this::createName

在课外你可以使用:

NameCreator creator = new NameCreator();
Function<String, String> func = creator::createName;

至于是使用单参数还是双参数版本,这取决于所针对的功能接口(interface)。以上将使用您的第一种方法,因为 Function<String, String>接受一个字符串并返回一个字符串。例如,以下功能接口(interface)将使用您的第二种方法:

NameCreator creator = new NameCreator();
BiFunction<String, String, String> func = creator::createName;

参见: Function , BiFunction ,和整个 java.util.function package

您可能还对 the Java tutorial on method references 感兴趣,特别是这部分:


方法引用有四种:

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
==============================================================================================

关于Java 8 方法引用 : how to determine which method to take?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51322724/

相关文章:

java - 使用 spring-data 和 jpa 切换 fetch 模式

java - 读取 double 矩阵的有效方法

java - 如何阻止 Java Scanner 接受输入

java - 如何将 Instant 转换为日期格式?

java - 显式使用 LambdaMetafactory

Java 8 : How to sort and collect two nested Maps with ArrayList inside?

java - 如何在 Java 中将 InputStream 读取/转换为字符串?

java - 当我尝试获取号码时,为什么我的 Activity 崩溃了?

java - 如何转换有时将转换后的值添加到 Java 8 流/lambda 的循环?

java - 如何将 JFX/OpenFX 与 OpenJDK 8 结合使用