Java中静态方法引用写作类名::静态方法名,需满足:Lambda体仅调用该静态方法、函数式接口参数与返回值类型完全匹配;常用于Function、Consumer、Predicate、Comparator等接口;注意重载冲突、参数匹配及不可加括号。

Java 中 Lambda 表达式引用静态方法,用的是 类名::静态方法名 这种写法,本质是把一段“只调用一个静态方法”的 Lambda 简化掉,让代码更干净、语义更清晰。
什么时候能用?
必须同时满足三个条件:
- Lambda 表达式体里只有一行调用静态方法的代码,没有其他逻辑(比如判断、赋值、打印等)
- 函数式接口抽象方法的参数个数、类型、顺序,和静态方法声明的参数完全一致
- 函数式接口抽象方法的返回值类型,和静态方法的返回值类型兼容(通常是完全相同)
常见搭配的函数式接口
静态方法引用不是独立存在的,它必须绑定到某个函数式接口上。最常用的是这四类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Function<T, R>:一进一出,如
String → Integer→ 对应Integer::parseInt -
Consumer<T>:只进不出,如
String → void→ 对应System.out::println(注意这是实例方法引用)或自定义的MyUtils::log -
Predicate<T>:输入一个,返回 boolean,如
String → boolean→ 对应Objects::isNull -
Comparator<T>:用于排序,如
(a, b) → int→ 对应Integer::compareTo
典型例子对照
左边是原始 Lambda,右边是等价的静态方法引用:
立即学习“Java免费学习笔记(深入)”;
-
str -> Integer.parseInt(str)→Integer::parseInt -
s -> s.length() > 0不能直接用静态方法引用(没有现成的静态方法做这个判断),但s -> !s.isEmpty()可以拆成Predicate.not(String::isEmpty) -
(a, b) -> Math.max(a, b)→Math::max(前提是函数式接口接受两个 int 并返回 int,比如BinaryOperator<Integer>) -
list.sort((a, b) -> Integer.compare(a, b))→list.sort(Integer::compare)
容易踩的坑
不是所有静态方法都能直接引用,要注意这些限制:
-
重载冲突:比如
Objects.equals有两个重载版本,直接写Objects::equals编译会报错;需显式指定类型,例如(BiPredicate<Object, Object>) Objects::equals -
参数不匹配:
Math.abs接收一个数,适合UnaryOperator<Integer>;但若函数式接口是Supplier<Integer>(无参),就不能用Math::abs -
方法引用不带括号:写成
Integer::parseInt()是错的,正确是Integer::parseInt—— 它只是“引用”,不是“调用”

















