类名::实例方法名表示将函数式接口的第一个参数作为调用对象,其余参数传入该实例方法,如string::comparetoignorecase适配comparator的compare(string a,string b),其中a为接收者、b为入参。

Java 中“特定类型的任意对象的实例方法引用”,写法是 类名::实例方法名,比如 String::length、Person::getName。它不是绑定某个具体对象,而是告诉编译器:“等会儿调用时,把第一个参数当作该类型的实例,再用它去调用这个方法,其余参数传给方法本身。”
核心逻辑:参数自动拆解为“接收者 + 入参”
函数式接口的参数列表会被编译器按规则拆分:
- 第一个参数 → 当作调用该实例方法的“对象”(即隐式的
this) - 后续参数 → 全部作为该实例方法的显式入参
例如:String::compareToIgnoreCase 适配 Comparator<string></string> 接口的 int compare(String a, String b) 方法:
→ a 是接收者,调用 a.compareToIgnoreCase(b);
→ b 是传给方法的唯一参数。
常见匹配场景和对应接口
这类引用最常出现在需要“对某类型对象执行其自身方法”的场合,典型例子包括:
-
Arrays.sort(arr, String::compareToIgnoreCase)→ 匹配Comparator<string></string> -
list.sort(Comparator.comparing(Person::getName))→Person::getName匹配Function<person string></person>(一个参数,返回属性值) -
list.stream().map(String::toUpperCase)→String::toUpperCase匹配Function<string string></string> -
list.removeIf(String::isEmpty)→String::isEmpty匹配Predicate<string></string>
和其它方法引用的关键区别
别把它和下面两种混淆:
-
对象::方法名(如
str::toUpperCase):str是已创建好的固定对象,每次调用都发生在它身上 -
类名::静态方法名(如
Objects::isNull):不涉及任何实例,纯静态调用 - 类名::实例方法名(即本文主题):没有预设对象,谁来调用,由函数式接口的第一个参数决定
使用前提:签名必须严格兼容
能否用 Class::method,取决于目标函数式接口的抽象方法签名是否能被“自动映射”:
- 方法无参数(如
toString())→ 要求接口只有一个参数,且类型为该类(如Function<object string></object>) - 方法有一个参数(如
String.contains(String))→ 要求接口有两个参数,第一个是String,第二个是String(如BiPredicate<string string></string>) - 返回值类型、参数类型都要一一对应,编译器不会做隐式转换(如基本类型与包装类需注意自动拆/装箱)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











