Вопрос или проблема
Сбор уникальных значений поля из объекта в стриме 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);
}
}
}
Пояснение кода
-
Создание класса
Employee
: У нас есть классEmployee
, который содержит поляid
,name
иmanagerId
. Конструктор и геттеры обеспечивают доступ к этим данным. -
Создание метода
findUniqueManagerIds
: Этот метод принимает список сотрудников, преобразует его в стрим, применяет методmap
для извлечения идентификаторов менеджеров, затем фильтрует их с помощьюdistinct()
, чтобы оставить только уникальные значения, и наконец, собирает результат в список с помощьюtoList()
. - В методе
main
: Мы создаем список сотрудников и вызываем методfindUniqueManagerIds
, чтобы получить список уникальных идентификаторов менеджеров.
Заключение
Таким образом, вы можете удобно собирать уникальные значения полей объектов в Java, используя стримы. Этот подход простой и эффективный, и отлично справляется с указанной задачей.