方法引用在stream的map中替代单参数lambda,需满足参数与返回值类型匹配;静态引用用类名::方法名,实例引用分对象::方法名和类型::方法名,构造器引用用class::new。

方法引用在 Stream 的 map 中替代单参数 Lambda,核心在于:参数类型与目标方法的形参类型一致,且返回值类型匹配映射后的泛型。只要满足“一个入参、一个出参”的契约,就能简洁替换。
静态方法引用:直接用类名::方法名
适用于工具类方法(如 String.valueOf、Integer.parseInt)或自定义静态转换逻辑。
- 要求:方法必须是 public static,且仅接收一个参数,返回值类型与
map所需结果类型一致 - 示例:
list.stream().map(String::valueOf)等价于list.stream().map(x -> String.valueOf(x)) - 注意:不能带额外参数,
String::format不适用(它需要 format 字符串 + 可变参数)
实例方法引用:对象::方法名(前提是对象已存在)
当调用的是某个已有对象的实例方法时使用,该对象作为调用主体,Stream 元素作为唯一入参传入。
- 示例:
String trimmer = " "; list.stream().map(trimmer::trim)→ 每个字符串都调用同一个trimmer.trim(s) - 常见误用:写成
" "::trim是合法的,但语义上不推荐——建议用String::trim更清晰(属于下一种)
特定类型实例方法引用:类型::方法名(最常用)
这是最典型的场景:对 Stream 中每个元素,调用其自身类型的某个无参实例方法(如 toString()、toLowerCase()),或带一个参数的重载方法(但 map 只提供一个参数,所以只能匹配无参或「当前对象为调用者、Stream 元素为唯一参数」的方法)。
- 本质是把 Stream 元素当作调用主体,例如
String::toLowerCase等价于s -> s.toLowerCase() - 支持链式方法:如
Path::getFileName、LocalDateTime::toLocalDate - 限制:不能用于需要多个参数的方法,也不能用于需要先获取对象再调用的方法(比如
list::get需索引,无法直接用于 map)
构造器引用:Class::new(用于创建新对象)
当 map 目标是将输入类型转为另一类型的新实例时,构造器引用非常干净。
- 要求:目标类有对应参数数量的构造器,且参数类型与 Stream 元素类型一致
- 示例:
stream.map(Integer::new)将字符串流转为 Integer 流(前提是元素是 String,且 Integer 有 String 构造器) - 更常见的是包装类或 DTO:如
strings.stream().map(User::new),前提是User有接受 String 的构造器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











