Вместо того, чтобы использовать AsyncContext.start(Runnable)
, я использовал CompletableFuture.runAsync(Runnable)
, и он работал как ожидалось.
Необходимо будет выполнить итерации на объектах и клонировать их один за другим, помещая клоны в массив результата, когда Вы идете.
public static List<Dog> cloneList(List<Dog> list) {
List<Dog> clone = new ArrayList<Dog>(list.size());
for (Dog item : list) clone.add(item.clone());
return clone;
}
Чтобы это работал, очевидно, необходимо будет получить Ваш Dog
класс для реализации Cloneable
соедините интерфейсом и переопределите clone()
метод.
Другие плакаты корректны: необходимо выполнить итерации списка и копии в новый список.
Однако... Если объекты в списке неизменны - Вы не должны клонировать их. Если Ваш объект будет иметь диаграмму составного объекта то - они должны будут быть неизменными также.
Другое преимущество неизменности - то, что они ориентированы на многопотоковое исполнение также.
Необходимо будет клонироваться ArrayList
вручную (путем итерации по нему и копирования каждого элемента в новое ArrayList
), потому что clone()
не сделает этого для Вас. Причина этого состоит в том, что объекты содержали в ArrayList
может не реализовать Clonable
самостоятельно.
Править:... и это точно, что делает код Varkhan.
Я, лично, добавил бы конструктора к Собаке:
class Dog
{
public Dog()
{ ... } // Regular constructor
public Dog(Dog dog) {
// Copy all the fields of Dog.
}
}
Затем просто выполните итерации (как показано в ответе Varkhan):
public static List<Dog> cloneList(List<Dog> dogList) {
List<Dog> clonedList = new ArrayList<Dog>(dogList.size());
for (Dog dog : dogList) {
clonedList.add(new Dog(dog));
}
return clonedList;
}
Я нахожу, что преимущество этого - Вы, не должны валять дурака с поврежденным материалом Cloneable в Java. Это также соответствует способу, которым Вы копируете наборы Java.
Другая опция могла состоять в том, чтобы записать Ваш собственный интерфейс ICloneable и использование это. Тем путем Вы могли записать общий метод для клонирования.
Ниже обработанного для меня..
в Dog.java
public Class Dog{
private String a,b;
public Dog(){} //no args constructor
public Dog(Dog d){ // copy constructor
this.a=d.a;
this.b=d.b;
}
}
-------------------------
private List<Dog> createCopy(List<Dog> dogs) {
List<Dog> newDogsList= new ArrayList<>();
if (CollectionUtils.isNotEmpty(dogs)) {
dogs.stream().forEach(dog-> newDogsList.add((Dog) SerializationUtils.clone(dog)));
}
return newDogsList;
}
Здесь новый список, который был создан из createCopy метода, создается через SerializationUtils.clone (). Таким образом, любое изменение, внесенное в новый список, не будет влиять на исходный список
Я думаю, что текущий зеленый ответ плохой , почему вы можете спросить?
Способ сериализации тоже плох, imo, вам, возможно, придется добавить Serializable повсюду.
Итак, каково решение:
Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая java-библиотека с открытым исходным кодом (лицензия apache), которая глубоко клонирует объекты. Объекты не обязательно должны реализовывать интерфейс Cloneable. Фактически, эта библиотека может клонировать ЛЮБЫЕ объекты Java. Его можно использовать, например, в реализациях кеширования, если вы не хотите, чтобы кэшированный объект изменялся или всякий раз, когда вы хотите создать глубокую копию объектов.
Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);
Проверьте это на https://github.com/kostaskougios/cloning