如何使用Java Stream API按对象内部列表元素对对象进行分组
Java Stream实现按电影类型分组的方案
实现代码
import java.util.AbstractMap; import java.util.Map; import java.util.stream.Collectors; Map<String, List<Movie>> moviesByGenre = movies.stream() // 平铺每个电影对应的所有genre,生成<genre, movie>键值对 .flatMap(movie -> movie.getGenres().stream() .map(genre -> new AbstractMap.SimpleEntry<>(genre, movie))) // 按genre分组,收集同类型的所有电影为列表 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
逻辑说明
- 首先通过
flatMap操作将每个Movie和它所属的每个genre拆解为独立的键值对条目,把一对多的关联关系平铺为单条的键值映射 - 再通过
Collectors.groupingBy以键值对的key(也就是genre名称)作为分组依据 - 最后使用
Collectors.mapping提取每个键值对的value(即Movie对象),汇总为List作为分组后Map的对应值
如果使用Java 9及以上版本,可以用更简洁的Map.entry()代替AbstractMap.SimpleEntry,代码可读性更强:
.flatMap(movie -> movie.getGenres().stream() .map(genre -> Map.entry(genre, movie)))
该方案全程使用标准Stream API完成,不需要手动初始化HashMap,也不需要在forEach中修改外部集合变量,符合Stream无副作用的使用规范。
内容的提问来源于stack exchange,提问作者Pedro Estevão
相关产品推荐
相关产品推荐

