当Lambda表达式仅调用已存在的静态方法且参数完全匹配时,可用“类名::静态方法名”替代,提升简洁性与可读性;要求形参顺序、类型、个数严格一致,JVM按序传递参数。

当 Lambda 表达式只是单纯调用一个已存在的静态方法,且参数类型和数量完全匹配时,就可以用 类名::静态方法名 替代,让代码更简洁、可读性更强。
适用前提:参数能自动对应
方法引用不是万能的,它要求 Lambda 的形参顺序、类型、个数,必须和静态方法的声明严格一致。JVM 会按顺序把 Lambda 的参数原样传给该静态方法。
- 比如
Function<string integer></string>的apply方法接收一个String,返回Integer;若有个静态方法Integer parseInt(String s),就能写成Integer::parseInt - 但
Math.max(int a, int b)有两个参数,就不能直接用于接收单个参数的函数式接口(如UnaryOperator),否则编译报错
常见使用场景举例
多数出现在函数式接口(Function、Consumer、Predicate、Supplier 等)的赋值或方法调用中:
-
list.sort(Integer::compareTo);—— 替代(a, b) -> Integer.compare(a, b) Arrays.stream(strArray).map(String::toUpperCase).collect(Collectors.toList());-
Optional.of("123").map(Integer::parseInt);—— 替代s -> Integer.parseInt(s) Stream.iterate(1, i -> i + 1).limit(5).forEach(System.out::println);
注意区分:不是所有静态方法都能直接引用
如果静态方法有重载,编译器可能无法推断具体调用哪一个,这时需要显式转型或改用 Lambda。
立即学习“Java免费学习笔记(深入)”;
- 例如
Objects.equals有两个重载版本((Object, Object)和(Object)),直接写Objects::equals会报错 - 解决办法:指定函数式接口类型,如
(BiPredicate<object object>) Objects::equals</object>,或改用(a, b) -> Objects.equals(a, b)
和普通 Lambda 比较:语义更明确
方法引用强调“复用已有逻辑”,而非“定义新行为”。阅读代码时,一眼能看出是调用哪个工具方法,比匿名函数更易理解。
-
str -> str.length() > 0→ 可换成String::isEmpty的取反,但更推荐str -> !str.isEmpty()或用Predicate.not(String::isEmpty) -
x -> Math.abs(x)直接换成Math::abs,干净利落


















