方法引用和构造方法引用是Java 8的语法糖,用于简化Lambda表达式。方法引用通过对象::方法名或类名::静态方法名直接引用已有方法,如System.out::println等价于s -> System.out.println(s);构造方法引用使用类名::new创建对象,如Person::new等价于name -> new Person(name)。常见形式包括静态方法引用(Integer::parseInt)、实例方法引用(String::toUpperCase)、特定对象方法引用(systemOut::println)和构造方法引用(ArrayList::new)。使用时需确保引用方法的参数和返回类型与函数式接口兼容,否则会导致编译错误。合理使用可提升代码可读性,但不应牺牲清晰度。

方法引用和构造方法引用是Java 8引入的特性,它们为Lambda表达式提供了一种更简洁的写法。当你已经有一个现成的方法或构造方法可以完成所需功能时,可以直接引用它,而不是重复写一遍逻辑。
什么是方法引用?
方法引用用于直接引用已有方法,语法是 对象::方法名 或 类名::静态方法名。它本质上是Lambda表达式的简化形式。
例如,有这样一个场景:将一个字符串列表转为大写并打印。
list.forEach(s -> System.out.println(s.toUpperCase()));这段代码可以用方法引用简化为:
立即学习“Java免费学习笔记(深入)”;
list.forEach(System.out::println);因为 System.out::println 等价于 s -> System.out.println(s)。
常见方法引用形式包括:
- 静态方法引用:Integer::parseInt,等价于 x -> Integer.parseInt(x)
- 实例方法引用:String::toUpperCase,等价于 str -> str.toUpperCase()
- 特定对象的方法引用:systemOut::println,引用某个对象的实例方法
- 父类方法调用:super::methodName,在子类中引用父类方法
什么是构造方法引用?
构造方法引用允许你引用一个类的构造方法,语法是 类名::new。它通常用于创建对象的工厂模式或集合处理中。
比如,你想把一串字符串转换成多个Person对象:
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
这里 Person::new 等价于 name -> new Person(name),前提是Person有一个接受String参数的构造函数。
构造方法引用根据参数数量自动匹配对应的构造函数:
- 无参构造:ArrayList::new → () -> new ArrayList()
- 单参构造:Person::new → name -> new Person(name)
- 双参构造:BiFunction
creator = Person::new;
使用场景与注意事项
方法引用和构造方法引用提升了代码可读性,但前提是被引用的方法签名必须与函数式接口的抽象方法兼容。
例如,Runnable 接口的 run() 方法无参无返回,就不能引用有参数的方法。
常见匹配情况:
- Consumer
c = System.out::println; ✅ 参数和返回类型匹配 - Supplier
s = "hello"::toUpperCase; ✅ 实例方法无输入,返回String - Function
f = Integer::valueOf; ✅ String入,Integer出
不匹配会导致编译错误,所以要确保上下文中的函数式接口与引用方法的参数、返回值一致。
基本上就这些。用好方法引用能让代码更干净,但别为了简洁牺牲可读性。理解它的本质是Lambda的语法糖,就知道什么时候该用,什么时候保持原样更清楚。









