方法引用是Java 8简化Lambda的语法糖,包括静态方法引用(ClassName::staticMethod)、特定对象实例方法引用(instance::method)、任意对象实例方法引用(ClassName::instanceMethod)和构造方法引用(ClassName::new)。

方法引用是 Java 8 引入的语法糖,用于简化只调用一个已有方法的 Lambda 表达式。当 Lambda 体只是“调用某个已有方法”,且参数类型、数量、返回值与该方法签名匹配时,就可以用方法引用替代,代码更简洁、语义更清晰。
静态方法引用:ClassName::staticMethod
适用于 Lambda 形如 (args) -> ClassName.staticMethod(args) 的情况。
- 例如,将字符串转为大写:
list.stream().map(String::toUpperCase).collect(Collectors.toList());- 等价于:
list.stream().map(s -> String.toUpperCase(s)).collect(...) - 注意:方法引用会自动适配参数顺序和个数——
String::toUpperCase是无参实例方法,但因为流中每个元素是String实例,所以编译器把当前元素作为隐式调用者(即s.toUpperCase())
实例方法引用(特定对象):instance::method
当方法属于某个已存在的具体对象时使用。
- 比如用预定义的格式器格式化数字:
NumberFormat nf = NumberFormat.getCurrencyInstance();list.stream().map(nf::format).collect(Collectors.toList());- 等价于:
list.stream().map(n -> nf.format(n)).collect(...)
实例方法引用(任意对象):ClassName::instanceMethod
适用于 Lambda 参数是调用者本身,方法是其实例方法(常见于 String、Integer 等类的方法)。
- 例如判断字符串是否为空:
list.stream().filter(String::isEmpty).collect(Collectors.toList());- 等价于:
list.stream().filter(s -> s.isEmpty()).collect(...) - 这里
String::isEmpty表示“对传入的每个 String 对象调用它的isEmpty()方法”
构造方法引用:ClassName::new
用于替代形如 () -> new ClassName() 或 (args) -> new ClassName(args) 的 Lambda。
- 无参构造:
Stream.generate(Person::new).limit(3).collect(Collectors.toList());- 带参构造(如
Function): Functionf = Person::new; // 等价于 s -> new Person(s) - 要求构造方法签名必须与函数式接口抽象方法的参数列表一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











