Сбор пользовательского объекта из списка пользовательских объектов, где значение объекта равно x

#java #java-8 #java-stream

#java #java-8 #java-поток

Вопрос:

Я изо всех сил пытаюсь понять, как собрать пользовательский объект из списка пользовательских объектов, где значение объекта равно x, используя Java streams.

Рассмотрим, что у меня есть класс ниже:

 public class Person {

    private int age;
    private double height;

    public Person(int age, double height) {
        this.age= age;
        this.height = height;
    }

    public int getAge() {
        return age;
    }

    public double getHeight() {
        return height;
    }
}
 

Затем учтите, что у вас есть заполненный список этих объектов, например List<Person> people .

Мой вопрос в том, как мне использовать потоки для создания нового List<Person> , который содержит только объекты person, возраст которых, скажем, 35 лет, из этого первоначального списка?

Пока у меня есть следующее:

 List<Person> peopleAged35 = new ArrayList<>();
peopleAged35.add(people.stream().filter(i -> i.getAge() == 35).map(new Person).collect(Collectors.toList()));
 

Это не компилируется, но я не думаю, что я далек от истины — может кто-нибудь указать, где я ошибаюсь?

Ответ №1:

Вам нужно удалить .map(new Person) его из вашего потока.

Кроме того, нет строгой необходимости создавать new ArrayList и добавлять их в него; Коллекторы.ToList вернет его вам в любом случае — хотя он будет доступен только для чтения.

Комментарии:

1. Похоже, что это не работает, я получаю следующее предупреждение о компиляции проблемы: Требуемый тип: Предоставленный пользователь: Список <com.xxx.xxx.xxx.people. Person> не существует экземпляров переменных типа T, чтобы List<T> соответствовал Person

2. Попробуйте избавиться от .add, чтобы это был просто List<People> over35 = people.stream() … проблема в том, что метод add является универсальным, поэтому он не уверен, какой тип возвращаемого значения. Если вы явно укажете это, это должно сработать.

Ответ №2:

 List<Person> aged35 = people.stream().filter(i -> i.getAge() == 35).collect(Collectors.toList())
 

Не уверен, почему вы сопоставляетесь с новым человеком. Если вам нужно получить новые объекты вместо ссылок, которые используются в базовом списке, вам, вероятно, следует клонировать объект (и создать для этого метод Person.clone()), например:

 List<Person> aged35 = people.stream().filter(i -> i.getAge() == 35).map(Person::clone).collect(Collectors.toList())
 

Комментарии:

1. Это также выглядит как хороший ответ и рассмотрит — Спасибо