java方法引用分三类:①this::method绑定当前实例;②obj::method绑定具体对象;③class::method绑定任意该类型实例,首参作接收者;均需严格匹配函数式接口签名。

Java 中方法引用调用不同类型的实例方法,关键在于明确“谁调用”和“调用谁”——即目标对象(接收者)与方法本身的绑定关系。方法引用本身不执行调用,它只是函数式接口的实现方式;真正触发调用的是后续通过函数式接口的抽象方法(如 accept、apply、get 等)来完成的。
引用自身实例方法(this::method)
当在当前对象上下文中引用本类的实例方法时,用 this::methodName。此时方法引用等价于一个接收单个参数(即调用该方法的对象)的函数式接口实现。
- 适用于
Consumer<t></t>、Function<t r></t>等接口,其中 T 是该方法所属的类型 - 例如:
list.forEach(this::processItem),假设processItem(Item item)是当前类的实例方法 - 注意:编译器会把
this作为隐式接收者,所以接口参数类型必须匹配该方法的声明类型
引用特定对象的实例方法(obj::method)
对已存在的具体对象,直接用 obj::methodName 引用其实例方法。这是最直观的方式,接收者固定,方法签名决定适配的函数式接口。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如
String::length是静态方法引用,但str::contains(str 是 String 实例)才是实例方法引用 - 若
str是"hello",则str::contains等价于(String s) -> str.contains(s) - 要求函数式接口的参数列表 = 该实例方法除隐式
this外的参数列表
引用任意类型实例的方法(Class::method)
用 ClassName::methodName 表示“对任意该类型的实例调用此方法”。此时第一个函数式接口参数被当作接收者(即 this),其余参数对应方法入参。
- 典型例子:
String::compareTo适配BiFunction<string string integer></string>或更常见地用于Comparator<string></string> - 因为
String.compareTo(String)是实例方法,所以String::compareTo等价于(s1, s2) -> s1.compareTo(s2) - 同理,
List::isEmpty可用于Function<list>, Boolean></list>,即接受一个 List 并调用其isEmpty()
注意事项与常见误区
方法引用不是语法糖的万能解,需严格匹配函数式接口的签名。尤其要注意:
- 实例方法引用不能脱离接收者存在,
String::length是静态方法引用(因为 length() 无参数且 String 类型确定),而s::length才是针对具体字符串实例的引用 -
Class::method形式仅适用于实例方法,且函数式接口第一个参数必须是该 Class 类型(作为 this) - 若方法重载,编译器可能无法推断,需显式转型或改用 lambda 避免歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










