方法引用通过复用已有方法提升代码简洁性与可读性,支持构造方法引用(user::new)、实例方法引用(user::getname)和静态方法引用(integer::parseint),但需严格匹配函数式接口签名。

方法引用能直接复用已有方法,避免冗余的 Lambda 表达式,在对象映射(比如 List 转换、DTO 与实体互转)中让代码更简洁、可读性更强。
用构造方法引用创建新对象
当目标类型有匹配的构造函数时,可用 ::new 直接映射生成新实例。例如把字符串列表转为 User 对象列表:
List<string> names = Arrays.asList("Alice", "Bob");
List<user> users = names.stream()
.map(User::new) // 调用 User(String name) 构造器
.collect(Collectors.toList());</user></string>
前提是 User 类存在单参 String 构造方法。这种方式比 name -> new User(name) 更紧凑,语义也更清晰。
用实例方法引用提取或转换字段
若源对象已有获取目标字段的方法(如 getter),可直接用 对象::方法名 提取值。例如从 User 列表中提取姓名:
List<user> users = ...;
List<string> names = users.stream()
.map(User::getName) // 等价于 user -> user.getName()
.collect(Collectors.toList());</string></user>
注意:方法引用必须是无参且返回所需类型的实例方法;静态方法则用 类名::方法名,比如 String::toUpperCase。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用静态方法引用做通用转换
常见工具类方法(如字符串处理、数值解析)适合用静态方法引用统一转换逻辑:
-
Integer::parseInt将字符串转整数 -
LocalDateTime::parse解析时间字符串 -
Objects::nonNull在 filter 中判空
例如:
List<string> strNumbers = Arrays.asList("1", "2", "3");
List<integer> ints = strNumbers.stream()
.map(Integer::parseInt)
.collect(Collectors.toList());</integer></string>
注意方法签名必须匹配函数式接口
方法引用不是万能的,它依赖上下文推断的函数式接口(如 Function、Supplier、Consumer)。常见坑包括:
- 构造器引用参数数量/类型必须与目标接口的抽象方法一致
- 实例方法引用的接收者(即“前面的对象”)由 stream 元素自动传入,不能额外指定
- 若需多参数或复杂逻辑,仍需写 Lambda,强行套方法引用反而难懂
比如 User::setName 不能直接用于 map,因为它是 void 方法且需要参数,而 map 要求返回值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










