Java 8列表副本

Mak*_*kky 4 java arraylist java-8

我有一个员工对象

我无法更新员工对象

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;
Run Code Online (Sandbox Code Playgroud)

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

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());

    }
}
Run Code Online (Sandbox Code Playgroud)

输出为11.

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

glg*_*lgl 11

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

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

我不确定是否clone()创建了对象的深层副本.如果是这样,一切都很好,如果没有,您可以使用流来创建深层副本.

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

public static Employee clone(Employee original) {
    return new Employee(original.getID(), original.getAge(), original.getGender(), original.getFirstName(), original.getLastName());
}
Run Code Online (Sandbox Code Playgroud)

然后呢

employeeList.stream().map(item -> clone(item)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

要不就

employeeList.stream().map(<thisclassname>::clone).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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


Pla*_*ant 8

首先在Employee类中创建一个复制构造函数:

    public Employee(Employee employee) {
        this.id = employee.id;
        this.age = employee.age;
        this.gender = employee.gender;
        this.firstName = employee.firstName;
        this.lastName = employee.lastName;
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Java 8流进行深层复制:

List<Employee> listTwo = employeeList.stream().map(item -> new Employee(item)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)