静态方法引用用类名::静态方法名表示,本质是将静态方法作为函数对象传入函数式接口,要求其参数列表、返回值类型与接口抽象方法完全匹配,且方法需为public static或包内可见。

静态方法引用用 类名::静态方法名 表示,本质是把一个静态方法“当做一个函数对象”传给接收函数式接口的地方,前提是该静态方法的参数列表和返回值要和目标接口的抽象方法匹配。
什么时候能用静态方法引用
只有当静态方法的签名(参数类型、顺序、返回类型)恰好符合某个函数式接口的抽象方法时,才能使用。比如 String::valueOf 可用于 Function<integer string></integer>,因为 String.valueOf(int) 接收 int 返回 String。
- 方法必须是
public static(或包内可见且在作用域内) - 不能有重载冲突(编译器需能唯一推断出调用哪个重载)
- 引用时不加括号、不传参——它只是“指向方法”,不是“调用方法”
常见用法场景
多用于 Stream、Collections、Runnable、Comparator 等需要函数式接口参数的 API 中。
-
Stream 转换:
list.stream().map(Integer::toString).collect(Collectors.toList()) -
排序:
list.sort(Comparator.comparing(String::length)) -
条件判断:
list.removeIf(Objects::isNull)(Objects.isNull是静态方法) -
线程启动:
new Thread(System::gc).start()(不推荐但语法合法)
参数匹配的细节
静态方法的第一个参数,对应函数式接口抽象方法的“入参”;返回值类型必须一致。例如:
立即学习“Java免费学习笔记(深入)”;
Math::max 类型是 (int, int) → int,可赋给 BinaryOperator<integer></integer>,但不能直接用于 Function<integer integer></integer>(后者只接受一个参数)。
- 若静态方法有多个参数,函数式接口的抽象方法也必须有相同数量和顺序的参数
- 泛型会自动推导,但类型不匹配时编译报错,如
Long::toHexString不能用于Function<Integer, String>
和 Lambda 的等价写法对比
String::valueOf 等价于 x -> String.valueOf(x);System::currentTimeMillis 等价于 () -> System.currentTimeMillis()(无参静态方法对应 Supplier)。
- 方法引用更简洁,语义更清晰
- 性能几乎无差别(JVM 层面优化程度相近)
- 调试时栈信息显示的是实际被调用的静态方法,不是 lambda 名称


















