Как избежать изменения состояния объекта внутри потока? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть такой код, как people.stream.filter (Object :: notNull) .map (person -> person.updateAge (...))

Я бы хотел избежать вызова updateAge () и дажеудалите этот метод и сделайте меня неизменным.Как я могу достичь этого, сохраняя структуру потока кода?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я не хочу изменять этот объект напрямую, а создать новый объект будет все поля с измененным возрастом.Это возможно

Да, это возможно.Вы можете переопределить метод clone() из Object:

@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());
0 голосов
/ 12 февраля 2019

Если вы хотите изменить объекты, значит, вы неправильно используете map!это forEach для побочных эффектов.

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

Но нет, мне все еще нравится быть функциональным и использовать неизменяемые объекты.В этом случае вам нужно заставить updateAge принять новую эпоху и вернуть новый объект персонажа с этой очень новой эпохой.

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

А затем получить поток новых людей, таких как

people.stream.filter(Object::notNull).map(person -> person.updateAge(...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...