方法引用和构造器引用是Lambda的简化写法,需严格匹配函数式接口签名:对象::实例方法、类::静态方法、类::实例方法、ClassName::new、Type[]::new五种形式各对应特定调用场景与参数规则。

Java 中方法引用和构造器引用本质是 Lambda 表达式的简化写法,核心在于“已有方法可复用”,且必须与函数式接口的抽象方法签名(参数类型、数量、返回值)严格匹配。不是任意方法都能直接引用,关键看上下文如何推导调用关系。
对象::实例方法 —— 引用已有对象的具体行为
适用于函数式接口抽象方法的参数列表,恰好等于该对象某个实例方法的参数列表(含隐式 this)。
- System.out::println → 对应 Consumer
的 accept(String s),因为 PrintStream 实例的 println 方法接受一个 String 参数 - student::getName → 对应 Supplier
的 get(),因为 getName 无参、返回 String,且调用者就是 student 实例 - 注意:不能写成 new Student()::getName,因为 new Student() 是临时对象,引用后可能被回收;应确保对象生命周期足够长
类::静态方法 —— 直接绑定工具类逻辑
要求函数式接口抽象方法的参数顺序和类型,完全对应静态方法的参数列表,返回值也一致。
- Integer::parseInt → 对应 Function
的 apply(String),因为 parseInt 接收 String 返回 int - Math::max → 对应 BinaryOperator
的 apply(Integer a, Integer b),因为 max(int, int) 两参数、返回 int - 不支持重载自动选择,如 String.valueOf 有多个重载,需靠接口类型推断,否则编译报错
类::实例方法 —— 把“调用者”作为第一个参数传入
这是最易混淆的一种。当函数式接口方法有多个参数,而目标实例方法只少一个参数时,第一个参数会被当作调用对象(即 this),其余参数传给该方法。
- String::compareTo → 对应 Comparator
的 compare(String s1, String s2)。s1 是调用者,s2 是传入参数,所以等价于 s1.compareTo(s2) - Pattern::matcher → 对应 BiFunction
的 apply(Pattern p, String s),即 p.matcher(s) - 不能用于 void 方法,因为函数式接口通常要求有返回值(如 Consumer 不适用此模式)
ClassName::new —— 构造器引用按需匹配
构造器引用本质是把 new 操作变成函数式接口的实现,参数个数和类型必须与目标构造器完全一致。
- ArrayList::new → 对应 Supplier
,无参构造 - Student::new → 若接口是 Function
,则匹配 Student(Integer id) 构造器 - 如果 Student 有 Student(String name, int age),就可用 BiFunction
接收 Student::new - 注意:不能引用 private 构造器,除非在同包或有访问权限
数组引用 Type[]::new —— 特殊的构造器引用
用于根据长度创建数组,对应 IntFunction
- String[]::new → 等价于 (int n) -> new String[n],常用于 Stream.toArray(String[]::new)
- int[]::new → 对应 IntFunction
,传入长度返回新数组 - 不能指定初始值,仅负责分配空间
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











