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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:39:01