方法引用可复用已有方法避免冗长Lambda,适用于对象转换场景;支持构造器引用(User::new)、实例方法引用(Person::getName)、静态方法引用(StringUtils::capitalize),但需注意类型匹配与空安全。

方法引用能直接复用已有方法,避免写冗长的 Lambda 表达式,特别适合对象转换这类“输入一个对象,返回另一个对象”的场景。
用 :: 复用构造器做类型转换
当目标是把字符串转成 User 对象,而 User 有对应参数的构造器时,可以直接引用构造方法:
-
User::new等价于s -> new User(s) - 配合
map使用最自然:list.stream().map(User::new).collect(...) - 注意构造器签名必须和函数式接口(如
Function<String, User>)匹配
用实例方法引用提取字段或调用转换逻辑
如果已有对象的方法能完成转换,比如 Person.getName() 提取姓名,就不用再写 p -> p.getName():
-
Person::getName直接作为Function<Person, String>使用 - 也可用于链式转换:
stream.map(Person::getProfile).map(Profile::toDto) - 要求被引用方法无参数(实例方法隐含 this),且返回值类型符合下游需要
用静态方法引用封装通用转换规则
把格式化、解析等逻辑抽成 static 方法后,引用更清晰、易测试:
立即学习“Java免费学习笔记(深入)”;
- 例如
StringUtils::capitalize替代s -> StringUtils.capitalize(s) - 静态方法需满足:参数列表与函数式接口一致,返回类型匹配
- 适合复用率高、不依赖实例状态的转换逻辑,比如日期解析、JSON 转换等
注意类型推导和空安全边界
方法引用本身不处理 null,也不自动适配参数数量,容易在编译或运行时报错:
- 编译错误常见于参数个数/类型不匹配,比如误用
String::length当作Function<String, Integer>是对的,但当BiFunction<String, Integer, Integer>就错 - 运行时 NPE 风险仍在,该判空还得判,方法引用不会帮你加
Objects.nonNull - 必要时可组合:
Optional.ofNullable(p).map(Person::getName).orElse("")


















