我有像people.stream.filter(Object :: notNull).map(person-> person.updateAge(...))这样的代码
我想避免调用updateAge()甚至删除该方法并使我的对象不可变。在保持代码流结构的同时如何实现?
答案 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());