静态方法引用用类名::静态方法名替代lambda,要求参数和返回值与函数式接口完全匹配,适用于objects、string、integer等工具类的静态方法,如integer::parseint、string::touppercase。

静态方法引用用 :: 直接关联类名和静态方法,替代冗长的 Lambda 表达式,特别适合调用工具类(如 Objects、String、Integer 等)中的静态方法。
语法格式:类名::静态方法名
前提是该静态方法的参数列表和返回值,必须与函数式接口抽象方法完全匹配。编译器会自动完成类型推导和适配。
-
正确示例:
Integer::parseInt可用于Function<string integer></string>,因为parseInt(String)接收一个String并返回Integer -
错误示例:
System.out::println是实例方法引用(PrintStream实例上的方法),不是静态方法引用;而Math::max虽是静态方法,但有两个重载版本,需显式指定类型或改用 Lambda 避免歧义
常见工具类静态方法引用场景
以下写法更简洁、语义更清晰:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 字符串转大写:
String::toUpperCase→ 替代s -> s.toUpperCase() - 字符串判空:
Objects::isNull或Objects::nonNull→ 常用于filter,如list.stream().filter(Objects::nonNull).toList() - 数值解析:
Double::parseDouble、LocalDate::parse→ 适用于map操作,如stream.map(Double::parseDouble) - 比较器构造:
Integer::compareTo(需注意是实例方法);真正静态的是Comparator.comparingInt(Integer::intValue),但可简化为Comparator.naturalOrder()—— 这里强调:只有明确属于类本身的静态方法才适用::
注意事项:参数数量与顺序必须严格匹配
静态方法引用不支持偏应用(partial application),也不能调整参数顺序。例如:
-
String::startsWith是实例方法,不能直接写成静态引用;若想用前缀过滤,得写成s -> s.startsWith("abc"),或封装为prefix -> s -> s.startsWith(prefix),再用curry—— 但 Java 原生不支持,此时静态引用不适用 -
Arrays::sort接收int[],但它的签名是void sort(int[]),无返回值,无法用于需要返回值的函数式接口(如Function),只能用于Consumer<int></int>
对比 Lambda:何时选静态方法引用?
优先用静态方法引用当满足两个条件:方法已存在、签名完全契合。它更轻量、可读性更高、且可能有轻微性能优势(避免 Lambda 实例化开销)。
- 推荐:
list.stream().map(Integer::valueOf).filter(Objects::nonNull) - 不推荐硬套:
str -> str.length() > 5不能写成静态引用,因为没有现成的静态方法接收String并返回boolean符合该逻辑 - 警惕误用:
"abc"::equals是对象方法引用(绑定到具体字符串实例),不是静态引用;真正的静态等价写法不存在,应保持为s -> "abc".equals(s)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










