我想创建一个克隆列表。我正在使用下面的代码段,但是即使MyClass
具有默认构造函数,我的IDE仍显示为“无法解析构造函数”的编译错误。
List<MyClass> clonedList =
myClassList.stream().map(MyClass::new).collect(Collectors.toList());
我是流媒体新手,如果我的语法错误,请帮助我。
答案 0 :(得分:5)
MyClass::new
仅在您的类具有一个采用单个参数且其类型为Stream
元素类型的构造函数的情况下才有效。没有参数的构造函数将无法正常工作。
myClassList.stream().map(MyClass::new)...
表现为
myClassList.stream().map(e -> new MyClass(e))...
由于myClassList
是MyClass
实例的列表,因此这意味着需要以下签名的构造函数才能使方法引用起作用-MyClass (MyClass other)
。
您仍然可以将无参数构造函数与以下lambda表达式一起使用:
myClassList.stream().map(e -> new MyClass())...
当然,这没有什么意义,因为它忽略了Stream
的原始元素。
由于您的目标是克隆List
,因此您需要一个复制构造函数:
public MyClass (MyClass other) {
// copy the properties of other to this instance
}