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

Java 中的构造方法引用用 ClassName::new 表示,本质是把“调用某个类构造器”这个动作当作一个函数式接口的实现来使用,适用于已有函数式接口、且其抽象方法签名与目标类构造器参数列表匹配的场景。
构造方法引用的基本前提
要成功使用 ClassName::new,必须满足:
- 目标类存在对应参数个数和类型的构造方法(包括无参)
- 所处上下文存在一个函数式接口(如
Supplier、Function、BiFunction等) - 该接口的抽象方法的参数类型和返回类型,与构造器的参数类型和类类型一致
常见用法与对应函数式接口
根据构造器参数数量,选择不同函数式接口:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
无参构造器 →
Supplier<t></t>Supplier<string> s = String::new;</string>等价于() -> new String() -
单参数构造器 →
Function<t r></t>Function<string bigdecimal> f = BigDecimal::new;</string>等价于s -> new BigDecimal(s) -
双参数构造器 →
BiFunction<t u r></t>BiFunction<string string person> b = Person::new;</string>(假设Person(String name, String id)) -
数组构造器 →
IntFunction<t></t>IntFunction<string> arrayCreator = String[]::new;</string>等价于len -> new String[len]
实际应用示例
常用于集合转换、流操作或工厂逻辑中:
- 将字符串列表转为
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</string>是合法的,但注意类型擦除后仍需语义匹配 - 不能带运行时参数(如
new ArrayList(10)这种带固定参数的写法无法用::new表达,需改用 Lambda)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










