应优先用双冒号(::)替代单方法lambda:静态方法引用如integer::parseint,实例方法分system.out::println(特定对象)和string::touppercase(任意对象),构造器引用如arraylist::new;须确保函数式接口、纯调用、签名完全匹配。

当 Lambda 表达式只做一件事:把参数原样传给一个已存在的方法,且参数类型、个数、顺序完全匹配时,就可以用 :: 替代,代码立刻变干净。
静态方法引用:类名::方法名
适用于调用工具类里的静态方法,比如转换、计算、判断等。
-
str -> Integer.parseInt(str)→Integer::parseInt -
s -> s.length() > 0不适合直接换,但s -> s.isEmpty()→String::isEmpty -
x -> Math.abs(x)→Math::abs
关键点:函数式接口的抽象方法签名,必须和静态方法声明一模一样。比如 Function<string integer></string> 的 apply 接收一个 String、返回 Integer,才能对接 Integer.parseInt(String)。
实例方法引用:分两种写法
一种是固定对象调用,一种是任意对象调用,语义不同。
-
System.out::println:固定对象(System.out)的实例方法,等价于x -> System.out.println(x) -
String::toUpperCase:任意String对象的方法,等价于s -> s.toUpperCase(),Lambda 参数自动作为调用者 -
list.sort(String::compareTo)可行,但String::compareToIgnoreCase要慎用——它不满足Comparator的严格偏序要求
构造器与数组引用:类名::new
用来替代无参或带参构造逻辑,避免 () -> new Xxx() 这类冗余写法。
-
() -> new ArrayList()→ArrayList::new -
(name, age) -> new Person(name, age)→Person::new(需存在对应构造器) -
len -> new int[len]→int[]::new,常用于Stream.generate()或toArray()
不能硬套的情况:一看就错
不是所有单行 Lambda 都能换,强行替换会编译失败或语义出错。
- 有重载方法时编译器可能无法推断,例如
Objects.equals有两个重载,直接写Objects::equals报错,得加类型强转:(BiPredicate<object object>) Objects::equals</object> -
e -> e % 2 == 0是计算逻辑,不是单纯转发,不能换成方法引用 -
(a, b) -> b.compareTo(a)参数顺序和String::compareTo相反,不匹配,不能换
核心就一条:方法引用不是语法捷径,而是语义对齐——你写的 Lambda 在做什么,被引用的方法就在做什么,不多不少,不增不减。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











