方法引用是lambda表达式的精简写法,用于直接调用已有方法,包括静态方法引用(classname::staticmethod)、绑定实例方法引用(object::instancemethod)、未绑定实例方法引用(classname::instancemethod)和构造器引用(classname::new),需与函数式接口签名兼容。

Java 中方法引用是 Lambda 表达式的精简写法,当 Lambda 体只是调用一个已有方法时,可用方法引用替代,让代码更简洁、语义更清晰。
方法引用的四种基本形式
方法引用通过双冒号 :: 连接目标(类或对象)与方法名,共四类:
-
静态方法引用:
ClassName::staticMethod,如String::valueOf -
实例方法引用(绑定对象):
object::instanceMethod,如str::toUpperCase -
实例方法引用(未绑定对象):
ClassName::instanceMethod,如String::length(接收一个 String 参数并调用其 length()) -
构造器引用:
ClassName::new,如ArrayList::new
匹配函数式接口的参数和返回值
方法引用能否使用,取决于它是否与目标函数式接口的抽象方法“签名兼容”——即参数个数、类型顺序、返回值类型需能对应上。例如:
-
Function<string integer></string>接口的apply(T)接收一个 String,返回 Integer → 可用String::length(String→int) -
Consumer<string></string>的accept(T)接收一个 String,无返回 → 可用System.out::println -
Supplier<list>></list>的get()无参、返回 List → 可用ArrayList::new
常见简化场景示例
以下对比传统 Lambda 与方法引用写法:
- 排序:
list.sort((s1, s2) -> s1.compareTo(s2))→list.sort(String::compareTo) - 字符串转换:
stream.map(s -> s.toUpperCase())→stream.map(String::toUpperCase) - 异常处理中抛出已有异常:
Optional.ofNullable(obj).orElseThrow(() -> new RuntimeException("null"))→ 若已有方法throwIfNull(),可写为orElseThrow(this::throwIfNull)
注意点:不能有额外逻辑或参数调整
方法引用本质是直接委托,不支持在调用前后加判断、转换或组合操作。比如想把字符串转大写再加前缀,就不能用 String::toUpperCase 直接替代 s -> "PREFIX_" + s.toUpperCase();此时仍需 Lambda 或封装成独立方法后再引用。
方法引用不是语法糖的炫技,而是对“已有行为”的复用表达。用得恰当,代码更直观;强行套用反而降低可读性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











