Как скопировать коллекцию без использования цикла? - PullRequest
0 голосов
/ 24 октября 2018

Интересно, есть ли какие-либо методы, доступные для глубокого копирования коллекции, вместо использования Iterator для ее циклического прохождения?Я не могу уменьшить его, так как мой метод принимает параметр типа Collection<Something> something.Благодаря.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Нет встроенного метода в 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;
   }
}

И вы можете ввести метод static в Copyable для выполнения глубокого копирования коллекции:

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.

0 голосов
/ 24 октября 2018

Вы можете использовать addAll для создания копии оригинальной коллекции.

...