从 Java 流中的对象收集不同的字段值

问题描述 投票:0回答:1

我正在尝试收集对象中字段之一的不同值。我希望在流中使用

distinct()
,但它不能应用于现场级别。我已经使用 Map 来获取映射到对象的列表。有没有办法只获取字段列表?

我有带有 ManagerId 的 Employee 对象,我想收集不同的 ManagerId 列表。

我的地图解决方案

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

我正在寻找

List<Long> managerIds = .....

java-stream
1个回答
0
投票

您可以使用流上的

distinct()
方法收集 ID:

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("Unique Manager IDs: " + uniqueManagerIds); 
        // Output: [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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.