Java流图修改类中未内置的自定义类对象

Gag*_*ngh 5 java java-8 java-stream

class Employee {

    public String name;
    public Integer age;
    public Employee(String n, int age) {
        this.name = n;
        this.age = age;
    }
    public String toString() {
        return this.name+":"+this.age;
    }
}
Run Code Online (Sandbox Code Playgroud)

内部主要:

ArrayList<Employee> list = new ArrayList<>();
list.add(new Employee("NameA", 10));
list.add(new Employee("NameB", 25));
list.add(new Employee("NameC", 30));
list.add(new Employee("NameD", 45));
list.add(new Employee("NameE", 50));

System.out.println(list);//[NameA:10, NameB:25, NameC:30, NameD:45, NameE:50]

list.stream().filter(e->e.age%10==0).map(e->e.name+="CHANGE").collect(Collectors.toList());

System.out.println(list); //[NameACHANGE:10, NameB:25, NameCCHANGE:30, NameD:45, NameECHANGE:50]


ArrayList<String> strList = new ArrayList<>();
strList.add("1");
strList.add("2");
strList.add("3");
strList.add("4");
strList.add("5");

System.out.println(strList);//[1, 2, 3, 4, 5]

List<String> updatedStrList = strList.stream().map(s->s+="CHANGE").collect(Collectors.toList());

System.out.println(updatedStrList);//[1CHANGE, 2CHANGE, 3CHANGE, 4CHANGE, 5CHANGE]

System.out.println(strList);//[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么?当 Employee 对象的值更改时,原始 ArrayList 中的值会更新,但当 String 的 ArrayList 更改时,值不会反映在原始 ArrayList 中。

Era*_*ran 3

e.name+="CHANGE"和之间有区别s->s+="CHANGE"。它们都创建一个新String实例,但是第一个将新实例分配String给该类实例的实例变量Employee(因此会改变该实例),而第二个将其分配给局部String变量。

因此e.name+="CHANGE",更改了原始实例的相应实例List,但s->s+="CHANGE"没有更改。

  • @GagandeepSingh 是的,“map”方法返回一个带有新“String”元素的新“Stream”。是的,在第一个示例中,您正在修改原始“Stream”的“Employee”元素(这也会影响原始“List”)。 (2认同)