静态方法引用语法为类名::静态方法名,不加括号、不传参,需与函数式接口抽象方法签名兼容,由接口方法调用时触发实际执行。

静态方法引用在 Java 中用双冒号 :: 连接类名和静态方法名,前提是方法签名要与函数式接口抽象方法兼容。写对的关键是:**类名 + :: + 静态方法名**,调用时由函数式接口触发,不是手动加括号执行。
语法格式与基本写法
静态方法引用的通用形式为:ClassName::staticMethodName。它不能带参数列表,也不能加括号,也不接受实例对象(因为是静态的)。
- ✅ 正确:
String::valueOf(对应Function<integer string></integer>) - ✅ 正确:
Math::abs(对应UnaryOperator<integer></integer>或IntUnaryOperator) - ❌ 错误:
String::valueOf()(加了括号,变成非法表达式) - ❌ 错误:
obj::toString(这是实例方法引用,且toString不是静态的)
匹配函数式接口的抽象方法
静态方法引用能否使用,取决于它的参数个数、类型和返回值是否与目标函数式接口的抽象方法一致。
- 例如
Integer::parseInt接收一个String,返回int,可赋给Function<string integer></string>或ToIntFunction<string></string> - 而
Arrays::sort是 void 方法,且参数多于一个,无法直接用于常见函数式接口(如Consumer仅接受一个参数),所以一般不作方法引用使用 - 若静态方法有重载,编译器根据上下文推断——若推断不清会报错,此时需显式转型或改用 Lambda
常见可用的 JDK 静态方法示例
以下方法在流操作或工具类场景中高频使用:
立即学习“Java免费学习笔记(深入)”;
-
Objects::nonNull→Predicate<t></t>,常用于filter -
String::toLowerCase→UnaryOperator<string></string>,用于map -
Integer::compare→Comparator<integer></integer>,用于sorted -
LocalDateTime::now→Supplier<localdatetime></localdatetime>,注意:无参静态方法引用可匹配Supplier
调用时机与实际执行
方法引用本身不执行逻辑,只是一种“延迟绑定”。只有当函数式接口的方法被调用时(比如 function.apply(x)、consumer.accept(x)),底层才真正调用对应的静态方法。
- 例如:
List<string> list = Arrays.asList("1", "2"); list.stream().map(Integer::parseInt).collect(Collectors.toList());</string>
此时每个字符串在map过程中才调用Integer.parseInt(s) - 不会在写
Integer::parseInt时就解析任何字符串,也不会提前抛出NumberFormatException


















