方法引用是Java 8的语法糖,用于简化只调用单个已有方法的Lambda表达式;分静态、已有对象实例、未定对象实例、构造方法四类,需参数类型匹配且无额外逻辑。

方法引用是 Java 8 引入的语法糖,用于替代简单 Lambda 表达式,让代码更简洁、可读性更强。它本质是 Lambda 的快捷写法,前提是 Lambda 体只调用一个已有方法,且参数和返回值类型匹配。
什么时候能用方法引用?
只有当 Lambda 表达式满足以下条件时,才能替换为方法引用:
- Lambda 形参全部作为实参传递给某个方法(顺序、数量、类型一致)
- 没有额外计算或逻辑,只是“原样转发”参数
- 目标方法存在且可访问(如 public 或包内可见)
四种方法引用形式及写法
根据被引用方法的类型,方法引用分四类:
-
静态方法引用: ClassName::staticMethodName
例如:
String::valueOf替代x -> String.valueOf(x) -
实例方法引用(对象已存在): object::instanceMethodName
例如:
System.out::println替代x -> System.out.println(x) -
实例方法引用(对象未定,用第一个参数作调用者): ClassName::instanceMethodName
例如:
String::toLowerCase替代s -> s.toLowerCase();此时第一个参数s自动作为调用对象 -
构造方法引用: ClassName::new
例如:
ArrayList::new替代() -> new ArrayList()或s -> new ArrayList(s)(取决于函数式接口参数个数)
常见使用场景示例
结合函数式接口,方法引用很实用:
-
Stream 处理:
list.stream().map(String::toUpperCase).filter(String::isEmpty) -
Comparator 排序:
list.sort(Comparator.comparing(Person::getAge)) -
Runnable 启动线程:
Thread t = new Thread(System.out::println); -
自定义函数式接口:
若接口
Fun定义为R apply(T t),则Math::abs可赋给Fun
注意事项和限制
方法引用不是万能的,要注意这些细节:
- 不能捕获局部变量(Lambda 可以,但方法引用本身不带闭包语义)
- 重载方法需确保编译器能唯一推断,否则编译失败(如
Integer::compareTo在某些上下文中可能歧义) - 泛型方法引用需注意类型擦除,必要时显式指定类型,如
Arrays::sort - 构造方法引用要与函数式接口的抽象方法签名严格对应(零参、单参、双参等)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











