Gagandeep Singh:
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;
}
}
Dentro principal:
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]
¿Cuál es la razón de este comportamiento? Cuando se cambia el valor del objeto Empleado el valor se actualiza en el ArrayList original, pero cuando ArrayList de cadena fue cambiado los valores no reflejaba en el ArrayList originales.
Eran :
Hay una diferente entre e.name+="CHANGE"
y s->s+="CHANGE"
. Ambos crear una nueva String
instancia, pero mientras los primeros cesionarios ese nuevo String
a una variable de instancia de una instancia de la Employee
clase (y, por tanto, que muta ejemplo), las segundas lo asigna a un local de String
la variable.
Por lo tanto e.name+="CHANGE"
cambia la instancia correspondiente del original List
y s->s+="CHANGE"
no lo hace.