Java中构造方法引用ClassName::new本质是将调用构造器作为函数式接口实现,需满足存在匹配构造器、上下文有对应函数式接口且签名一致;常见用法包括Supplier(无参)、Function(单参)、BiFunction(双参)、IntFunction(数组);实际用于流转换、对象生成及Optional默认值创建;注意不可引用私有构造器、重载需可推断、泛型需语义匹配、不支持带固定参数的构造调用。

Java 中的构造方法引用用 ClassName::new 表示,本质是把“调用某个类构造器”这个动作当作一个函数式接口的实现来使用,适用于已有函数式接口、且其抽象方法签名与目标类构造器参数列表匹配的场景。
构造方法引用的基本前提
要成功使用 ClassName::new,必须满足:
- 目标类存在对应参数个数和类型的构造方法(包括无参)
- 所处上下文存在一个函数式接口(如
Supplier、Function、BiFunction等) - 该接口的抽象方法的参数类型和返回类型,与构造器的参数类型和类类型一致
常见用法与对应函数式接口
根据构造器参数数量,选择不同函数式接口:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
无参构造器 →
Supplier<T>Supplier<String> s = String::new;等价于() -> new String() -
单参数构造器 →
Function<T, R>Function<String, BigDecimal> f = BigDecimal::new;等价于s -> new BigDecimal(s) -
双参数构造器 →
BiFunction<T, U, R>BiFunction<String, String, Person> b = Person::new;(假设Person(String name, String id)) -
数组构造器 →
IntFunction<T[]>IntFunction<String[]> arrayCreator = String[]::new;等价于len -> new String[len]
实际应用示例
常用于集合转换、流操作或工厂逻辑中:
立即学习“Java免费学习笔记(深入)”;
- 将字符串列表转为
BigDecimal列表:list.stream().map(BigDecimal::new).collect(Collectors.toList()); - 用
Stream.generate创建多个新对象:Stream.generate(Person::new).limit(5).collect(Collectors.toList());(需有无参构造器) - 配合
Optional.orElseGet()延迟创建默认对象:optional.orElseGet(ArrayList::new);
注意事项
构造方法引用不是万能的,要注意:
- 不能直接引用私有构造器(编译报错),除非在同一个类内且可见
- 如果类有多个重载构造器,编译器会根据函数式接口推断具体调用哪一个;若无法唯一确定,会编译失败
- 泛型类如
ArrayList<String>::new是合法的,但注意类型擦除后仍需语义匹配 - 不能带运行时参数(如
new ArrayList(10)这种带固定参数的写法无法用::new表达,需改用 Lambda)

















