java中类名::静态方法本质是创建函数式接口实例,将静态方法作为抽象方法实现;需满足public static修饰且方法签名与接口抽象方法完全匹配。

Java 中用 类名::静态方法 的方式引用静态方法,本质是创建一个函数式接口的实例,把该静态方法“当作”接口中抽象方法的实现来用。它不是直接调用方法,而是传递方法本身(类似函数指针),等后续被函数式接口的抽象方法调用时才真正执行。
什么时候能用?
必须满足两个前提:
- 目标方法是 public static 的(访问权限和静态修饰符缺一不可)
- 该静态方法的参数列表和返回值类型,要与你要赋值的函数式接口中唯一抽象方法的签名完全匹配(参数个数、类型顺序、返回类型一致)
常见写法示例
以 Function<string integer></string> 接口为例,它的抽象方法是 Integer apply(String s):
对应地,Integer.parseInt 是一个 public static 方法,签名为 int parseInt(String s) —— 参数是 String,返回是 int,可自动装箱为 Integer,所以兼容:
Function<string integer> parser = Integer::parseInt;</string>
之后可以这样用:
int num = parser.apply("123"); // 返回 123
不能用的典型情况
下面这些写法会编译失败:
-
Math::abs用于Function<string integer></string>→ 参数类型不匹配(abs接int或long,不是String) -
System.out::println→ 这是实例方法引用(println属于PrintStream实例),不是静态方法 -
MyUtils::privateStaticMethod→ 私有静态方法无法被外部引用 -
Arrays::sort→sort有多个重载且无返回值,很难匹配到无参/单参/返回值匹配的函数式接口
配合 Stream 和其他函数式场景
最常用在 map、filter、reduce 等操作中,让代码更简洁:
List<string> strs = Arrays.asList("1", "2", "3");</string>List<integer> nums = strs.stream().map(Integer::parseInt).collect(Collectors.toList());</integer>
这里 map 接收 Function super String, ? extends R>,而 Integer::parseInt 恰好满足 Function<string integer></string>,所以可以直接传入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











