#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. Это также выглядит как хороший ответ и рассмотрит — Спасибо