方法引用通过复用已有方法替代单方法调用的lambda表达式,使代码更简洁、意图更明确,分为静态、绑定实例、未绑定实例和构造器四类,严格匹配函数式接口签名,不可添加额外逻辑。

方法引用通过复用已有方法替代冗长的 Lambda 表达式,直接让代码更短、意图更明确。它不新增逻辑,而是把“调用什么方法”这件事表达得更直白。
替换单方法调用的 Lambda
当 Lambda 体只做一件事:调用一个已有方法,且参数和返回值完全匹配,就可直接替换。
-
原来写法:
list.forEach(item -> System.out.println(item)) -
方法引用:
list.forEach(System.out::println) -
排序简化:
list.sort((a, b) -> a.compareTo(b))→list.sort(String::compareTo) -
转换操作:
stream.map(s -> s.toUpperCase())→stream.map(String::toUpperCase)
四类引用精准对应不同场景
不是所有方法都能随便引用,必须看目标函数式接口的抽象方法签名(参数个数、类型顺序、返回值)是否与被引用方法一致。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
静态方法引用:
Integer::parseInt(对应Function<string integer></string>) -
绑定实例方法:
str::length(str是确定对象,对应Supplier<integer></integer>) -
未绑定实例方法:
String::length(接收一个String参数并调用其length(),对应Function<string integer></string>) -
构造器引用:
ArrayList::new(对应Supplier<list></list>或Function<integer list></integer>等)
流处理中自然降低嵌套与重复
在 Stream 链式调用中,方法引用让每一步操作语义清晰,避免层层包裹的箭头函数。
- 过滤 + 映射组合:
list.stream().filter(Objects::nonNull).map(String::trim).collect(toList()) - 异常抛出简化:
optional.orElseThrow(() -> new IllegalArgumentException("empty"))→ 若有throwIfEmpty()方法,可写为optional.orElseThrow(this::throwIfEmpty) - 自定义比较器:
people.stream().sorted(Comparator.comparing(Person::getName)),比写完整 Lambda 更易读
注意边界:不能加逻辑,也不能改参数
方法引用是“原样委托”,不支持中间加工。一旦需要额外处理,就得退回 Lambda 或封装新方法。
- ❌ 错误尝试:
s -> "ID_" + s.toUpperCase()无法用String::toUpperCase直接替代 - ✅ 正确做法:提取成独立方法
static String formatId(String s) { return "ID_" + s.toUpperCase(); },再引用MyClass::formatId - ⚠️ 类型不匹配时编译失败,比如用
String::length赋给Consumer<string></string>就会报错(返回int,但Consumer要求无返回)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










