方法引用通过编译器自动匹配函数式接口抽象方法签名与目标方法的参数个数、类型和顺序实现参数隐式传递:静态引用一对一映射;特定对象实例引用固定调用者后传剩余参数;任意对象实例引用将首个参数作为调用者;构造引用直接映射参数到构造器。

方法引用在 Lambda 中实现参数规约,本质是编译器根据函数式接口的抽象方法签名,自动匹配目标方法的参数个数、类型和顺序,从而省去显式写出参数的过程。它不是“减少参数”,而是让参数传递逻辑隐式化、结构化。
静态方法引用:参数完全一对一映射
当使用 类名::静态方法名 时,Lambda 的每个参数会按顺序原样传给静态方法——参数数量、类型、顺序必须严格一致。
-
示例:Comparator
comp = String::compareToIgnoreCase;
对应函数式接口抽象方法为int compare(String s1, String s2),而String.compareToIgnoreCase(String)接收一个参数,但这里实际是“将第一个参数作为调用者,第二个作为入参”——这是实例方法引用的规则,不是静态引用。真正静态引用如:Math::max对应(int a, int b) -> Math.max(a, b),两个参数直接传入。 - 关键点:静态方法本身不依赖对象状态,所以 Lambda 参数列表就是它的全部入参,无隐藏参数。
特定对象的实例方法引用:固定调用者 + 剩余参数传入
使用 对象实例::实例方法名 时,“对象实例”已确定,Lambda 的参数只负责传给该方法的其余参数(即去掉“调用者”后的参数)。
-
示例:StringBuilder sb = new StringBuilder();
Functionappender = sb::append;
调用appender.apply("hello")等价于sb.append("hello")。
函数式接口R apply(T t)只有一个参数,它被直接传给append(String),而sb是固定的接收者。 - 注意:该对象必须在引用时已存在且非 null,否则运行时报 NullPointerException。
任意对象的实例方法引用:首个参数自动作为调用者
使用 类名::实例方法名(如 String::length)时,编译器把 Lambda 的第一个参数当作方法调用的目标对象,其余参数(如有)才传给方法本身。
立即学习“Java免费学习笔记(深入)”;
-
示例:Function
len = String::length;
等价于s -> s.length()。Lambda 参数s自动成为length()的调用者,方法本身无入参,所以只消耗一个参数。 - 再如:BiFunction
compare = String::compareTo;
等价于(s1, s2) -> s1.compareTo(s2)。第一个参数s1是调用者,第二个s2是compareTo的入参。 - 这是参数规约最易混淆的地方:表面看方法定义无参数(如
length()),但它依赖一个隐式接收者,而这个接收者由 Lambda 的第一个参数提供。
构造方法引用:参数直接用于 new 实例
使用 类名::new 时,Lambda 参数全部用于构造器调用,参数个数和类型必须与某一个构造器完全匹配。
-
示例:Supplier
supplier = ArrayList::new;
对应无参构造器,Lambda 无需参数(() -> new ArrayList())。 - Function
withCapacity = ArrayList::new;
对应ArrayList(int)构造器,Lambda 接收一个Integer参数并传入。 - 没有“规约”动作,只是参数到构造器的直连映射。


















