java方法引用可简洁替代lambda表达式,适用于对象转换场景,分为静态方法引用(类名::静态方法)、实例方法引用(实例::实例方法)和构造器引用(类名::new),需确保参数、返回值与函数式接口匹配。

Java 中方法引用可以简洁地替代 Lambda 表达式,尤其适合对象转换这类“输入一个对象,输出另一个对象”的场景。关键在于目标方法必须是静态的、实例的或构造器,且参数和返回值类型要与函数式接口匹配。
用静态方法引用做类型转换
当转换逻辑封装在静态工具方法中时,直接用 类名::静态方法 即可。例如把字符串转为整数:
- 定义工具类:public static Integer parse(String s) { return Integer.parseInt(s); }
- 使用:Function
converter = IntegerUtils::parse; - 调用:Integer result = converter.apply("123");
注意:静态方法的参数顺序必须与函数式接口的输入参数一致,返回值类型也要匹配。
用实例方法引用做属性提取或格式化
若转换依赖某个已有对象的状态(比如格式化日期),可用 实例::实例方法。例如用 DateTimeFormatter 格式化 LocalDateTime:
- 准备实例:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- 绑定方法:Function
toString = formatter::format; - 调用:String dateStr = toString.apply(LocalDateTime.now());
这里 formatter::format 实际等价于 (dt) -> formatter.format(dt),自动把输入参数作为方法的接收者。
用构造器引用创建新对象
最常见于 DTO 转换,比如将 UserEntity 映射为 UserDTO:
- 确保 UserDTO 有对应参数的构造器:public UserDTO(String name, int age) { ... }
- 引用构造器:Function
toDto = UserDTO::new; - 前提是 UserEntity 类型能提供构造器所需的参数(如通过 getter 方法);实际常配合方法链使用:entity -> new UserDTO(entity.getName(), entity.getAge()) 可简化为 UserDTO::new,但需确保函数式接口签名与构造器一致。
注意事项和常见陷阱
方法引用不是万能的,容易出错的地方包括:
- 参数数量或顺序不匹配:比如 String::length 是无参方法,只能用于 Supplier
或 Function ,不能用于 Function - 泛型擦除导致类型推断失败:必要时显式声明函数式接口类型,或用带类型参数的变量接收
- 空指针风险:实例方法引用依赖非 null 对象,构造器引用依赖非 null 参数,建议提前校验
本质上,方法引用是语法糖,它让代码更聚焦“做什么”,而不是“怎么写”。只要签名对得上,它比 Lambda 更直观、更易读。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











