Java 8列表副本

参见英文答案 > How to clone ArrayList and also clone its contents?                                    17个
我有一个员工对象

我无法更新员工对象

public class Employee {

    public Employee(Integer id, Integer age, String gender, String fName, String lName) {
        this.id = id;
        this.age = age;
        this.gender = gender;
        this.firstName = fName;
        this.lastName = lName;
    }

    private Integer id;
    private Integer age;
    private String gender;
    private String firstName;
    private String lastName;

我最初设置一个员工列表,但想创建它的副本,然后对其进行更改.即使我正在创建新列表,它仍在更改原始列表

public class ListTest {

    public static void main(String[] args) {

        List<Employee> employeeList = new ArrayList<>();
        Employee employee = new Employee(1, 1, "MALE", "TEST", "TEST");
        employeeList.add(employee);

        List<Employee> listTwo = new ArrayList<>();
        listTwo.addAll(employeeList);

        listTwo.get(0).setAge(11);

        System.out.println(employeeList.get(0).getAge());

    }
}

输出为11.

是否有更简单的方法从原始列表克隆,任何更改不应该应用于原始列表对象和我创建的新列表

最佳答案
它不会更改原始列表,但它正在更改两个列表中包含的对象.

在这种情况下,使员工对象不可修改并提供创建具有相对于原始属性的已更改属性的复制对象的可能性可能非常有用.

我不确定clone()是否创建了对象的深层副本.如果是这样,all is fine,如果没有,你可以use streams to create a deep copy.

如果您绝对无法修改Employee对象(甚至不添加复制构造函数),您可以这样做:

public static Employee clone(Employee original) {
    return new Employee(original.getID(), original.getAge(), original.getGender(), original.getFirstName(), original.getLastName());
}

然后呢

employeeList.stream().map(item -> clone(item)).collect(Collectors.toList());

要不就

employeeList.stream().map(<thisclassname>::clone).collect(Collectors.toList());

(基本上和Uata建议的相同,但是你自己进行复制).

转载注明原文:Java 8列表副本 - 代码日志