【问题标题】:How to copy a collection without using a loop?如何在不使用循环的情况下复制集合?
【发布时间】:2018-10-24 15:46:03
【问题描述】:

我想知道是否有任何方法可用于深度复制集合而不是使用迭代器来循环它?由于我的方法采用Collection<Something> something 之类的参数,因此我无法对其进行降级。谢谢。

【问题讨论】:

  • 你的意思是没有me循环,对吗?否则答案是:不可能,因为您(或“实用程序”函数)需要遍历所有元素才能复制它们。

标签: java collections deep-copy


【解决方案1】:

Java 中没有内置方法允许为集合制作深拷贝,原因很简单:深拷贝的定义取决于类。
没有实用方法可以猜到它,并且依赖不是推荐接口的Cloneable 不是一个好主意。
所以你必须自己做这个任务。

您可以通过引入一个接口来使事情更通用,该接口定义了一个复制方法,每个深复制的类都实现了该方法。
例如:

public interface Copyable<T> {

   T copy();
}

并实现它如:

public class Foo implements Copyable<Foo> {

   public Foo copy(){
      Foo foo = new Foo();
      // deep copy values in foo
      return foo;
   }
}

您可以在Copyable 中引入static 方法来执行深度集合复制:

public static <T extends Copyable<T>> List<T> deepCopyToList(Collection<T> collection) {
    return collection.stream()
                     .map(Copyable::copy)
                     .collect(Collectors.toList());
}

并以这种方式使用它:

List<Foo> foos = new ...;
List<Foo> fooCopies = Copyable.deepCopyToList(foos);

Foo 在哪里实现Copyable

【讨论】:

  • List&lt;T&gt; result = new ArrayList&lt;&gt;(collection); result.replaceAll(Copyable::copy);
【解决方案2】:

您可以使用 addAll 创建原始集合的副本。

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2010-11-12
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多