构造方法引用是Lambda表达式中的语法糖,用于替代已有构造逻辑的函数式接口实现,形式为类名::new,需匹配对应参数数量与类型的构造方法,并必须赋值给兼容的函数式接口。

构造方法引用不是用来“快速创建对象”的独立手段,而是 Lambda 表达式中的一种语法糖,用于**替代已有构造逻辑的函数式接口实现**。它本身不直接 new 对象,而是把“调用某个类构造方法”这个行为,封装成一个可传递、可复用的引用。
构造方法引用的基本形式
语法为:::new,放在类名后面。根据参数数量和类型,对应不同构造方法:
-
无参构造:例如
Person::new→ 等价于() -> new Person() -
单参构造:例如
Person::new(若 Person 有Person(String name))→ 等价于name -> new Person(name) -
双参构造:例如
Person::new(若 Person 有Person(String name, int age))→ 等价于(name, age) -> new Person(name, age) -
数组构造:例如
String[]::new→ 等价于size -> new String[size]
必须配合函数式接口使用
构造方法引用不能 standalone 写,必须赋值给一个**恰好匹配参数和返回类型的函数式接口**。常见场景包括:
-
Supplier
:接收零参数,返回对象 → 用无参构造,如 Supplier- > listGen = ArrayList::new;
-
Function
:接收一个参数,返回对象 → 用单参构造,如 FunctionpersonMaker = Person::new; -
BiFunction
:接收两个参数 → 用双参构造,如 BiFunctionbuilder = Person::new; -
IntFunction
:接收 int → 常用于数组,如 IntFunctionarrayCreator = String[]::new;
实际应用示例
假设定义了如下 Person 类:
private String name;
private int age;
public Person() {}
public Person(String name) { this.name = name; }
public Person(String name, int age) { this.name = name; this.age = age; }
}
你可以这样使用构造方法引用:
Suppliersupplier = Person::new; // 调用无参构造 FunctionnameBased = Person::new; // 调用 Person(String) List<person> persons = Arrays.asList("Alice", "Bob").stream()<br> .map(Person::new)<br> .collect(Collectors.toList()); // 每个字符串生成一个 Person</person>
注意事项
构造方法引用依赖编译器推断,所以必须满足:
- 目标函数式接口的抽象方法签名,必须与某一个可用构造方法完全匹配(参数类型、顺序、数量)
- 被引用的构造方法必须具有可访问权限(public 或包内可见等),否则编译报错
- 不支持带泛型类型推导的复杂构造(如
new ArrayList无法直接写成() ArrayList::new并自动推导泛型,但可通过显式类型声明或上下文辅助推断) - 不会绕过构造逻辑——它仍会执行构造方法体,包括字段初始化、this 调用、异常抛出等完整流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











