java中方法引用调用静态方法的本质是用::操作符替代仅调用静态方法的lambda表达式,要求方法签名与函数式接口兼容,语法为类名::静态方法名,不加括号、不传参,需满足访问权限且避免重载歧义。

Java 中方法引用调用特定类的静态方法,本质是用 :: 操作符替代 Lambda 表达式中仅调用一个静态方法的场景,前提是方法签名与函数式接口抽象方法兼容。
语法格式:类名::静态方法名
这是最直接的方式。只要目标静态方法的参数列表和返回值类型匹配函数式接口的抽象方法,就能使用。
-
例如:
String::valueOf可用于接收一个参数并返回String的函数式接口(如Function<integer string></integer>) - 调用时不需要加括号,也不传参——参数由函数式接口在运行时自动传递
- 类名必须可访问(public 或同一包内),静态方法也需有足够访问权限(通常 public 或 package-private)
常见使用场景:配合函数式接口
方法引用本身不执行,必须赋值给函数式接口类型的变量或作为参数传入接受该接口的方法。
-
Function<double long> f = Math::round;</double>—— 调用Math.round(double) -
Supplier<localdatetime> now = LocalDateTime::now;</localdatetime>—— 无参静态方法,对应Supplier -
UnaryOperator<string> upper = String::toUpperCase;</string>—— 注意:这是实例方法引用;静态方法如Objects::toString才是正确示例
注意访问权限和重载歧义
如果静态方法被重载,编译器可能无法推断具体调用哪个版本。
- 比如
Integer::parseInt有两个重载:parseInt(String)和parseInt(String, int) - 当上下文不能唯一确定时(如赋值给
Function<object integer></object>),会编译失败 - 解决办法:改用 Lambda 显式指定,或调整函数式接口类型使签名唯一匹配
不能直接“执行”,必须通过函数式接口触发
方法引用不是方法调用语句,它生成的是实现了函数式接口的实例对象。
- 错误写法:
String::valueOf(123);—— 编译不通过 - 正确用法:
Function<integer string> f = String::valueOf; String s = f.apply(123);</integer> - 也可直接传参:
list.stream().map(String::valueOf).collect(...)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











