Потоки Java 8 — получение различных целых чисел из списка объектов в виде массива

#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());