You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8:如何通过嵌套ID列表过滤Map并使用Streams生成新列表

问题:从嵌套ID列表中筛选对应Employee对象列表

数据示例

现有嵌套整数列表List<List<Integer>>和ID到Employee对象的映射Map<Integer, Employee>,数据如下:

List<List<Integer>> ids = new ArrayList<>();
ids.add(Arrays.asList(1, 2));
ids.add(Arrays.asList(2, 3));

Map<Integer, Employee> employeesByEmployeeId = new HashMap<>();
employeesByEmployeeId.put(1, new Employee("Test"));
employeesByEmployeeId.put(2, new Employee("Test1"));
employeesByEmployeeId.put(3, new Employee("Test2"));
employeesByEmployeeId.put(4, new Employee("Test3"));

需求

获取所有ID存在于上述嵌套列表中的Employee对象列表,预期结果:

[Employee("Test"), Employee("Test1"), Employee("Test2")]

现有不完整代码

List<List<EmployeDTO>> employeeDto = data.getEmployee().stream().map(EmployeeDto::getSubEmployee).toList();
Set<Set<Integer>> ids = employeeDto.stream().map(employee -> employee.stream().map(EmployeeDto::getIds).collect(Collectors.toSet()));

正确实现方案

核心思路是先把嵌套ID列表扁平化为去重的ID集合,再从映射表中提取对应Employee对象:

分步实现

// 1. 扁平化嵌套列表,得到去重的目标ID集合
Set<Integer> targetIds = ids.stream()
        .flatMap(List::stream)
        .collect(Collectors.toSet());

// 2. 从Map中筛选ID匹配的Employee并收集为列表
List<Employee> result = employeesByEmployeeId.values().stream()
        .filter(emp -> targetIds.contains(emp.getId())) // 假设Employee类有getId()方法
        .collect(Collectors.toList());

简洁合并版

List<Employee> result = ids.stream()
        .flatMap(List::stream)
        .distinct()
        .map(employeesByEmployeeId::get)
        .filter(Objects::nonNull) // 避免ID不存在时出现null
        .collect(Collectors.toList());

注:上述代码假设Employee类包含获取ID的getId()方法,可根据实际类结构调整。

内容的提问来源于stack exchange,提问作者Nidhi257

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:13:11