如何避免改变流中对象的状态?

时间:2019-02-11 21:40:19

标签: java object java-stream immutability

我有像people.stream.filter(Object :: notNull).map(person-> person.updateAge(...))这样的代码

我想避免调用updateAge()甚至删除该方法并使我的对象不可变。在保持代码流结构的同时如何实现?

2 个答案:

答案 0 :(得分:0)

如果您想对对象进行突变,那么您就误用了map!是forEach的副作用。

people.forEach(person -> person.updateAge(...))

但是,我仍然不喜欢发挥功能并使用不可变的对象。在这种情况下,您需要使updateAge使用新年龄并返回具有该新年龄的新人物对象。

Person updateAge(int incrementBy) {
   ... new Person(..., newAge); 
}

然后得到这样的新朋友

people.stream.filter(Object::notNull).map(person -> person.updateAge(...))

答案 1 :(得分:0)

  

我不想直接修改该对象,而是创建一个新对象,将所有相同的字段更改为age字段。那可能吗

是的,有可能。您可以从对象覆盖方法clone()

@Override
public Person clone() {
    try {
        return (Person) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new RuntimeException(e);
    }
}

别忘了实现Cloneable

public class Person implements Cloneable {
    ...

假设您拥有updateAge()这样的方法:

public Person updateAge(int age) {
    this.setAge(age);
    return this;
}

然后流链看起来像:

List<Person> newPeople = people.stream()
            .map(Person::clone)
            .map(person -> person.updateAge(...))
            .collect(toList());