为了账号安全,请及时绑定邮箱和手机立即绑定

Java流映射修改未内置在类中的自定义类对象

Java流映射修改未内置在类中的自定义类对象

30秒到达战场 2021-10-13 16:32:58
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 中更新,但是当 String 的 ArrayList 更改时,这些值并未反映在原始 ArrayList 中。
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

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

因此e.name+="CHANGE"更改了原始的相应实例,Lists->s+="CHANGE"不是。


查看完整回答
反对 回复 2021-10-13
?
万千封印

TA贡献1891条经验 获得超3个赞

问题与流无关。

在这个 lambda 表达式中:s -> s += "CHANGE",您只是重新分配了局部变量ss += "CHANGE"还返回连接的结果,这就解释了为什么流显示映射值。这种重新分配仅在 lambda 表达式的局部范围内有效。

而是e.name+="CHANGE"更新Employee对象的字段e。这会更新原始对象本身。

您应该收集映射值而不是更新原始流元素。顺便说一句,在您的情况下,更新原始流元素甚至不是一种选择,因为您无法修改 String 对象。


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信