Java中构造器引用(类名::new)是Lambda的等价语法糖,用于对象创建,需与函数式接口签名严格匹配参数类型和数量,支持泛型显式指定但不支持菱形运算符。

Java 中 Lambda 表达式本身不直接“引用”构造方法,而是通过构造器引用(Constructor Reference)这种语法糖来替代等效的 Lambda 写法。它不是 Lambda 的一种形式,而是与 Lambda 等价、更简洁的表达方式,专用于对象创建场景。
构造器引用的基本写法
使用 类名::new 语法,对应函数式接口中抽象方法的签名(参数个数和类型)自动匹配目标构造器:
- 无参构造器:直接写
ArrayList::new,适用于Supplier<List<String>>等无入参、有返回值的接口 - 单参构造器:如
ArrayList::new也可匹配Function<Integer, List<String>>,因为ArrayList(int)接收一个int参数 - 多参构造器:如
BigDecimal::new可用于BiFunction<String, MathContext, BigDecimal>,前提是参数顺序和类型完全一致
泛型与类型推断要点
构造器引用支持显式指定泛型类型,但不能用菱形运算符(<>):
- ✅ 正确:
Supplier<List<String>> supplier = ArrayList<String>::new; - ❌ 错误:
ArrayList<>::new编译不通过 - 类型由函数式接口的泛型决定,编译器据此选择对应构造器,无需额外标注
常见使用场景
构造器引用主要出现在需要延迟创建对象或批量生成实例的地方:
立即学习“Java免费学习笔记(深入)”;
-
Stream.generate(ArrayList::new).limit(5).collect(Collectors.toList())—— 生成 5 个空 ArrayList -
mapToInt(Integer::new)配合字符串转数字(需存在Integer(String)构造器) - 配合自定义类:
Function<String, Person> factory = Person::new;,前提是Person有接受String的构造器
注意匹配失败的情况
构造器引用能否成功,取决于函数式接口抽象方法的签名是否与某个可用构造器完全一致:
- 参数数量、类型顺序必须严格匹配
- 不可访问 private 或包私有构造器(同普通 new 调用规则)
- 若类有多个构造器,编译器根据上下文自动选择;若无法唯一确定,会报错


















