java方法引用通过classname::method等形式简洁适配函数式接口,要求接口单抽象方法且签名兼容;包括静态、实例、任意对象及构造器引用四种形式。

Java 中方法引用可以简洁地实现函数式接口的适配,本质是将已有方法“绑定”为符合接口签名的实例,无需手动写 Lambda 表达式。
方法引用适配函数式接口的基本条件
要成功使用方法引用,必须满足:目标接口有且仅有一个抽象方法(即它是函数式接口),且该方法的参数列表和返回值类型,与被引用方法的签名兼容(允许自动类型转换,如基本类型与包装类、子类与父类)。
- 静态方法引用:
ClassName::staticMethod,要求接口抽象方法的参数顺序和类型完全匹配该静态方法的参数(首参不额外提供) - 实例方法引用:
object::instanceMethod,接口方法参数直接传给实例方法,调用时隐式绑定对象 - 特定类型任意对象的方法引用:
String::length,接口第一个参数作为调用对象,后续参数传给方法 - 构造器引用:
ClassName::new,用于适配接口中返回新实例的抽象方法
常见适配场景与写法对比
以 Function<string integer></string> 为例,三种等效写法:
- Lambda:
s -> s.length() - 方法引用(类型+方法):
String::length—— 接口参数String自动作为调用对象 - 实例引用:
"hello"::length—— 固定对 "hello" 调用 length,返回固定值 5
再如 Comparator<person></person> 的适配:
-
Comparator.comparing(Person::getAge)利用Person::getAge适配Function super Person, ? extends U> -
(p1, p2) -> p1.getName().compareTo(p2.getName())可简化为Comparator.comparing(Person::getName)
注意返回类型与空值处理
方法引用本身不改变原方法行为,若被引用方法可能返回 null 或抛出异常,适配后的接口实例同样如此。例如:
-
String::toUpperCase适配UnaryOperator<string></string>是安全的 -
Objects::requireNonNull适配Function<string string></string>会在输入为 null 时立即抛出NullPointerException - 若需空安全,应先封装逻辑(如用
Optional.ofNullable(s).map(String::length).orElse(0)),再转为方法引用或改用 Lambda
构造器引用实现工厂模式适配
当接口抽象方法返回对象且无参时,可用 ClassName::new;若带参,则按参数数量匹配构造器:
Supplier<list>> listFactory = ArrayList::new</list>-
Function<integer int> arrayFactory = int[]::new</integer>—— 接口参数Integer传给int[capacity]构造器 -
BiFunction<string integer bigdecimal> bdCreator = BigDecimal::new</string>—— 匹配BigDecimal(String, int)构造器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











