静态方法引用用类名::静态方法名替代单静态方法调用的lambda,要求参数类型、个数、顺序及返回值与函数式接口抽象方法完全匹配,如integer::parseint适配function,math::max适配bifunction。

静态方法引用用 类名::静态方法名 替代只调用单个静态方法的 Lambda 表达式,前提是参数类型、个数、顺序和返回值必须完全匹配函数式接口的抽象方法。
适用前提:参数必须严格一致
编译器不会做类型转换或参数调整,它只是把 Lambda 的参数按顺序原样传给静态方法。
- Function
接口的 apply(String) 方法接收一个 String,返回 Integer → 可用 Integer::parseInt(因为 parseInt(String) 签名完全匹配) - BiFunction
的 apply(int, int) → 可用 Math::max(两个 int 参数,返回 int) - 但不能用 Math::max 去替代只接收一个参数的接口(如 UnaryOperator),否则编译失败
常见使用场景
多出现在 Stream、Optional、Collections 等需要函数式逻辑的地方:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
字符串转数字:
list.stream().map(Integer::parseInt) -
大小写转换:
stream.map(String::toUpperCase) -
排序比较:
list.sort(Integer::compareTo)(等价于 (a,b) -> Integer.compare(a,b)) -
条件判断:
optional.map(String::trim).filter(String::isEmpty)
注意重载方法的歧义问题
当静态方法有多个重载版本时,编译器可能无法确定该选哪一个。
- 例如
Objects.equals有两个重载:equals(Object, Object)和equals(Object) - 直接写
Objects::equals会报错 - 解决办法:显式指定函数式接口类型,如
(BiPredicate<object object>) Objects::equals</object>,或退回用 Lambda
和普通 Lambda 的区别
方法引用不是语法糖的“炫技”,而是语义强化:
-
s -> s.length() > 0是自定义逻辑,可读性一般 -
String::isEmpty明确表示“调用 String 自带的 isEmpty 方法”,意图清晰 - 它强调复用已有、经过测试的工具方法,而非现场编写新行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










