如何用Java 8 Stream按条件遍历嵌套列表并生成指定Map
Java 8 Stream 实现列表转指定Map结构
实体类定义
public class ClassOne { private Long id; private List<ClassTwo> secondClass; // 需提供getter方法:getId(), getSecondClass() } public class ClassTwo { private Long link; private ClassThree thirdClass; // 需提供getter方法:getLink(), getThirdClass() } public class ClassThree { private Long number; // 需提供getter方法:getNumber() }
可用数据
List<ClassOne> classOneList List<Long> referencedNumbers
需求说明
遍历classOneList,生成Map<Long, List<Long>>:
- 键:
ClassOne的id属性 - 值:满足条件的
ClassTwo的link集合 - 过滤条件:该
ClassTwo关联的ClassThree的number值存在于referencedNumbers中
约束条件
- 必须使用Java 8 Stream实现,禁止使用循环
- 返回类型严格为
Map<Long, List<Long>>
解决方案代码
import java.util.List; import java.util.Map; import java.util.stream.Collectors; Map<Long, List<Long>> resultMap = classOneList.stream() .collect(Collectors.toMap( ClassOne::getId, classOne -> classOne.getSecondClass().stream() // 过滤符合条件的ClassTwo .filter(classTwo -> referencedNumbers.contains(classTwo.getThirdClass().getNumber())) // 提取link属性 .map(ClassTwo::getLink) // 收集为List作为Map的值 .collect(Collectors.toList()) ));
关键说明
- 外层通过
Collectors.toMap直接将ClassOne映射为目标键值对结构 - 内层对每个
ClassOne的secondClass列表开启子Stream,完成条件过滤和属性提取 - 若存在重复的
ClassOne.id,默认toMap会抛出IllegalStateException,如需处理重复键,可添加合并函数:
Collectors.toMap( ClassOne::getId, classOne -> /* 内层逻辑 */, (existingList, newList) -> { existingList.addAll(newList); return existingList; } )
内容的提问来源于stack exchange,提问作者Vasanth
相关产品推荐
相关产品推荐

