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
相关产品推荐
相关产品推荐

