java方法引用用::实现,是lambda的简写,需匹配函数式接口签名;分静态(类名::方法)、实例(对象::方法或类名::方法)和构造(类名::new)三种形式。

Java 中方法引用通过双冒号 :: 操作符实现,本质是 Lambda 表达式的简写形式,但必须满足函数式接口的签名匹配。调用静态方法和实例方法的方式不同,关键在于“谁来调用”以及“参数如何传递”。
静态方法引用:类名::静态方法名
静态方法属于类本身,不依赖对象实例,因此方法引用直接用类名开头。
- 语法格式:
ClassName::staticMethodName - 要求:函数式接口的抽象方法参数列表,必须与静态方法的参数完全一致(顺序、类型),返回值也需兼容
- 示例:将
String.valueOf(int)作为Function<integer string></integer>使用
实例方法引用:对象引用::实例方法名
当已有具体对象时,可用该对象引用调用其非静态方法。此时方法引用会绑定该实例,后续调用自动以它为调用者。
- 语法格式:
instanceRef::instanceMethodName - 要求:函数式接口抽象方法的第一个参数,会被当作该实例方法的隐式调用对象(即
this),其余参数依次对应实例方法的形参 - 示例:用已创建的
String对象调用startsWith
Predicate
实例方法引用(无目标对象):类名::实例方法名
这是最容易混淆的一种。写成 ClassName::instanceMethodName,但实际表示“把第一个参数当作调用对象”,适用于需要动态传入接收者的场景。
- 语法格式:
ClassName::instanceMethodName - 要求:函数式接口抽象方法至少有一个参数,且第一个参数类型必须是该类或其子类;该参数在运行时作为调用对象(
this) - 示例:用
String::toLowerCase实现UnaryOperator<string></string>
构造方法引用:类名::new
虽然不是静态或实例方法,但常与它们并列使用。用于替代无参或带参构造逻辑。
- 语法格式:
ClassName::new(支持重载,编译器根据函数式接口推断) - 示例:
Supplier<arraylist> sup = ArrayList::new;</arraylist>或Function<integer int> arr = int[]::new;</integer>
方法引用不是语法糖那么简单,它依赖类型推导和函数式接口契约。写错时编译器通常报“无法解析方法引用”,多数源于参数数量/类型不匹配,或静态/实例语义混淆。多结合 IDE 提示和接口定义检查,比死记语法更有效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











