Сбор уникальных значений поля из объекта в стриме Java

Вопрос или проблема

Сбор уникальных значений поля из объекта в стриме Java

Я пытаюсь собрать уникальные значения одного из полей объекта. Я надеялся использовать distinct() в потоке, однако его нельзя применить на уровне поля. Я использовал Map, чтобы получить список, сопоставленный с объектом. Есть ли способ получить только список полей?

У меня есть объект Employee с ManagerId, и я хотел бы собрать уникальный список ManagerId.

Мое решение с использованием Map

Map<Long, Employee> employeeMap = employees.stream()
     .collect(Collectors.toMap(Employee::getManagerId, Function.identity(), (o, n) -> n));

Я ищу, чтобы получить List<Long> managerIds = .....

Вы можете собрать ID, используя метод distinct() в потоке:

List<Long> managerIds = employees.stream()
    .map(Employee::getManagerId)
    .distinct()
    .toList();

Вот базовый фрагмент кода:

import java.util.List;
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        List<Employee> employees = List.of(
            new Employee(1L, "Alice", 10L),
            new Employee(2L, "Bob", 20L),
            new Employee(3L, "Charlie", 10L),
            new Employee(4L, "David", 30L),
            new Employee(5L, "Eve", 20L)
        );

        List<Long> uniqueManagerIds = findUniqueManagerIds(employees);
        System.out.println("Уникальные ID менеджеров: " + uniqueManagerIds); 
        // Вывод: [10, 20, 30]
    }

    public static List<Long> findUniqueManagerIds(List<Employee> employees) {
        return employees.stream()
            .map(Employee::getManagerId)
            .distinct()
            .toList();
    }
}
public static class Employee {
    private Long id;
    private String name;
    private Long managerId;

    public Employee(Long id, String name, Long managerId) {
        this.id = id;
        this.name = name;
        this.managerId = managerId;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Long getManagerId() {
        return managerId;
    }

    @Override
    public String toString() {
        return String.format("Employee{id=%d, name="%s", managerId=%d}", id, name, managerId);
    }
}

Ответ или решение

Чтобы собрать уникальные значения поля из объекта в Java, можно воспользоваться стримами и методами класса Collectors. В вашем случае, вы хотите получить уникальные идентификаторы менеджеров из списка сотрудников. Это можно сделать с помощью следующего подхода.

Пример кода

Вот как можно реализовать эту задачу:

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Employee> employees = List.of(
            new Employee(1L, "Alice", 10L),
            new Employee(2L, "Bob", 20L),
            new Employee(3L, "Charlie", 10L),
            new Employee(4L, "David", 30L),
            new Employee(5L, "Eve", 20L)
        );

        List<Long> uniqueManagerIds = findUniqueManagerIds(employees);
        System.out.println("Уникальные идентификаторы менеджеров: " + uniqueManagerIds); 
        // Ожидаемый вывод: [10, 20, 30]
    }

    public static List<Long> findUniqueManagerIds(List<Employee> employees) {
        return employees.stream()
            .map(Employee::getManagerId) // Получаем поток идентификаторов менеджеров
            .distinct() // Отбираем уникальные значения
            .toList(); // Собираем в список
    }

    public static class Employee {
        private Long id;
        private String name;
        private Long managerId;

        public Employee(Long id, String name, Long managerId) {
            this.id = id;
            this.name = name;
            this.managerId = managerId;
        }

        public Long getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public Long getManagerId() {
            return managerId;
        }

        @Override
        public String toString() {
            return String.format("Employee{id=%d, name=\"%s\", managerId=%d}", id, name, managerId);
        }
    }
}

Пояснение кода

  1. Создание класса Employee: У нас есть класс Employee, который содержит поля id, name и managerId. Конструктор и геттеры обеспечивают доступ к этим данным.

  2. Создание метода findUniqueManagerIds: Этот метод принимает список сотрудников, преобразует его в стрим, применяет метод map для извлечения идентификаторов менеджеров, затем фильтрует их с помощью distinct(), чтобы оставить только уникальные значения, и наконец, собирает результат в список с помощью toList().

  3. В методе main: Мы создаем список сотрудников и вызываем метод findUniqueManagerIds, чтобы получить список уникальных идентификаторов менеджеров.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...