Java 8提供了一种新的方法来调用元素狗上的复制构造函数或克隆方法:溪流, 兰巴斯和收藏家.
复制构造函数:List clonedDogs = dogs.stream().map(Dog::new).collect(toList());
表达Dog::new称为a方法参考..它创建一个函数对象,该对象调用Dog以另一只狗为论据。
克隆方法[1]:List clonedDogs = dogs.stream().map(d -> d.clone()).collect(toList());
得到一个ArrayList结果
或者,如果你必须得到一个ArrayListBack(万一您以后想修改它):ArrayList clonedDogs = dogs.stream().map(Dog::new).collect(toCollection(ArrayList::new));
更新列表
如果不需要保留dogs列表,您可以使用replaceAll方法并更新列表:dogs.replaceAll(Dog::new);
所有的例子都假设import static java.util.stream.Collectors.*;.
收集器ArrayLists
上一个示例中的收集器可以变成util方法。既然这是一件很平常的事,我个人喜欢它又短又漂亮。就像这样:ArrayList clonedDogs = dogs.stream().map(d -> d.clone()).collect(toArrayList());public static
Collector> toArrayList() {
return Collectors.toCollection(ArrayList::new);}
[1]关于CloneNotSupportedException:
若要使此解决方案运行在clone方法Dog 绝不能宣布它抛出CloneNotSupportedException..原因是map不允许抛出任何已检查的异常。
就像这样:// Note: Method is public and returns Dog, not Object
@Override
public Dog clone() /* Note: No throws clause here */ { ...
不过,这不应该是个大问题,因为这是最好的做法。(效果Java例如,给出这个建议。)
感谢古斯塔沃注意到这一点。
PS:
如果您发现它更漂亮,您可以使用方法引用语法来做完全相同的事情:List clonedDogs = dogs.stream().map(Dog::clone).collect(toList());