方法引用是Java 8的语法糖,用于简化仅调用单个已有方法的Lambda表达式;分四类:静态方法(类名::方法)、特定对象实例方法(对象::方法)、任意对象实例方法(类名::方法)、构造方法(类名::new)。

方法引用是 Java 8 引入的语法糖,用来替代只调用一个已有方法的简单 Lambda 表达式,让代码更简洁、可读性更强。
什么时候能用方法引用?
当 Lambda 表达式形如 () -> object.method() 或 (x) -> object.method(x),且该方法已存在、签名匹配函数式接口的抽象方法时,就可以替换为方法引用。
- 参数个数和类型要与目标方法一致(或可自动适配)
- 返回值类型也要兼容
- 不能有额外逻辑(比如判断、计算、多语句),否则必须写完整 Lambda
四种方法引用写法及对应示例
1. 引用静态方法:类名::静态方法名
例如:String::valueOf 替代 x -> String.valueOf(x)
2. 引用特定对象的实例方法:对象::实例方法名
例如:System.out::println 替代 x -> System.out.println(x)
3. 引用任意对象的实例方法:类名::实例方法名
例如:String::toLowerCase 替代 s -> s.toLowerCase()(参数 s 是 String 类型)
4. 引用构造方法:类名::new
例如:ArrayList::new 替代 () -> new ArrayList(),或 Integer::new 替代 s -> new Integer(s)
常见误用和注意事项
方法引用不是万能的,容易出错的情况包括:
- 方法重载时,编译器可能无法推断具体调用哪个,需显式转型或改用 Lambda
- 引用实例方法但上下文没有明确对象(比如
list::add中 list 为 null,运行时报错) - 试图传递带参数的方法引用却漏掉参数,比如把
Math::max用于需要BinaryOperator<integer></integer>的场景是合法的,但用于Function<integer integer></integer>就不匹配
实际对比:Lambda vs 方法引用
假设有一个字符串列表:
立即学习“Java免费学习笔记(深入)”;
List<string> list = Arrays.asList("a", "B", "c");</string>
→ 转成大写并排序:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 Lambda:list.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
简化为方法引用:list.sort(String::compareToIgnoreCase);
→ 转换为长度列表:
用 Lambda:list.stream().map(s -> s.length()).collect(Collectors.toList());
简化为方法引用:list.stream().map(String::length).collect(Collectors.toList());
不复杂但容易忽略细节。关键在理解“谁调用谁”和“参数怎么流转”,多写几次就自然了。

















