方法引用是Java 8中Lambda表达式的快捷写法,用于引用静态方法、实例方法或构造方法,需与函数式接口签名兼容,语法包括ClassName::staticMethod、object::instanceMethod、ClassName::instanceMethod和ClassName::new四种形式。

方法引用是 Java 8 引入的 Lambda 表达式增强特性,它能让代码更简洁、可读性更强,尤其在已有方法可复用时,避免重复写 Lambda 的“样板逻辑”。
什么是方法引用
方法引用本质上是 Lambda 表达式的快捷写法,用于直接引用已有类或对象的静态方法、实例方法、构造方法。前提是该方法签名与函数式接口的抽象方法兼容(参数类型和返回值匹配)。
语法形式有四种:
-
静态方法引用:
ClassName::staticMethod -
实例方法引用(特定对象):
object::instanceMethod -
实例方法引用(任意对象):
ClassName::instanceMethod -
构造方法引用:
ClassName::new
用方法引用替代常见 Lambda 冗余
比如对字符串列表排序,传统 Lambda 写法:
立即学习“Java免费学习笔记(深入)”;
list.sort((s1, s2) -> s1.compareTo(s2));
其实就是在调用 String 的实例方法 compareTo,完全可用方法引用简化:
list.sort(String::compareTo);
再比如过滤非空字符串:
list.stream().filter(s -> s != null && !s.isEmpty())
如果已有一个工具方法:
public static boolean isNotBlank(String s) { return s != null && !s.trim().isEmpty(); }
就可以直接引用:.filter(MyUtils::isNotBlank),比内联 Lambda 更清晰、易复用、易测试。
注意参数匹配和上下文推断
方法引用不是万能的,必须满足函数式接口抽象方法的签名。例如:
-
Function<string integer></string>接口要求一个参数、一个返回值 → 可用String::length(int length()符合) -
Consumer<string></string>要求一个参数、无返回 → 可用System.out::println(void println(String)符合) - 但不能把
String::toUpperCase用于Consumer,因为它是String → String,返回值不为 void
编译器会根据目标函数式接口自动推断接收者和参数顺序,例如 String::compareTo 在 Comparator<string></string> 上下文中,第一个参数是调用者(隐式),第二个是传入参数。
构造方法引用简化对象创建
配合 Supplier、Function 等接口,构造方法引用能消除 new 表达式冗余。例如:
List<String> names = Arrays.asList("Alice", "Bob");
List<Person> persons = names.stream()
.map(Person::new) // 假设 Person 有 String 构造函数
.collect(Collectors.toList());
比 s -> new Person(s) 更简练;若需多参构造,只要函数式接口支持对应参数数量即可,如 BiFunction<integer string person>::new</integer> 对应 Person(int id, String name)。


















