#arrays #java-8 #java-stream
#массивы #java-8 #java-stream
Вопрос:
Я изо всех сил пытаюсь понять, как получить отдельные целые числа из списка объектов в виде массива, используя потоки.
Рассмотрим, что у меня есть класс ниже:
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
.
Мой вопрос в том, как мне использовать потоки Java для извлечения различных возрастов в массив Int?
Что у меня есть до сих пор:
List<Integer> distinctAge = people.stream().distinct().mapToInt().collect(Collectors.groupingBy(Person::getAge));
Очевидно, что это не компилируется, но я упираюсь в стену относительно того, куда идти дальше.
Как только у меня будет этот массив, я планирую захватить все объекты из списка, которые содержат отдельное значение — я предполагаю, что это также возможно с использованием потоков?
Комментарии:
1. Если вы прочитаете то, что вы написали, это будет похоже на, создайте поток людей, затем найдите среди них различные значения, выполните их сопоставление с целым числом и, наконец, соберите их в результате. Вернитесь к этой мысли и посмотрите, что вам нужно исправить, это может помочь.
Ответ №1:
Вы можете собирать все возрасты, используя map и вызов distinct для различных значений
Integer[] ages = persons.stream()
.map(Person::getAge)
.distinct()
.toArray(Integer[]::new);
Если вы хотите собрать в int[]
int[] ages = persons.stream()
.mapToInt(Person::getAge)
.distinct()
.toArray();
Ответ №2:
Мой вопрос в том, как мне использовать потоки Java для извлечения различных возрастов в массив Int?
Как только у меня будет этот массив, я планирую захватить все объекты из списка, которые содержат отдельное значение — я предполагаю, что это также возможно с использованием потоков?
Перефразируя эту проблему,
Вам нужна карта <Целое число, список>, где ключ карты — это возраст, а значение — список людей этого конкретного возраста.
Map<Integer, List<Person>> agePersonMap =
people.stream()
.collect(Collectors.groupingBy(Person::getAge));
Ответ №3:
Лучше использовать Set вместо distinct, поскольку это повышает производительность.
Set<Integer> ages = persons.stream().map(Person::getAge).collect(Collectors.toSet());