Gagandeepシン:
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;
}
}
インサイドメイン:
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]
この現象の理由は何ですか?Employeeオブジェクトの値が変更されているときは値が元のArrayListに更新されますが、文字列のArrayListのを変化させたときの値が元のArrayListには反映されませんでした。
彼らは次のとおりでした:
間で異なるありますe.name+="CHANGE"
とはs->s+="CHANGE"
。それらの両方は、新規作成String
インスタンスが、最初の割り当てながら、その新しいString
インスタンスのインスタンス変数のEmployee
クラス(したがって、変異している場合)、ローカルに第割り当て、それをString
変数。
したがってe.name+="CHANGE"
、元の対応するインスタンスを変更するList
とs->s+="CHANGE"
しません。