如何在Java中使用groupingBy按genres属性对电影列表进行分组
你可以通过将单条电影记录按所属genre拆分为多个「分类-电影」键值对,再按分类分组的方式实现需求,示例代码如下:
首先确保你用于接收接口数据的电影实体类结构如下(和你现有实体类字段、getter保持一致即可):
public class Movie { private String title; private List<String> genres; // 构造方法、setter自行补充 public String getTitle() { return title; } public List<String> getGenres() { return genres; } }
分组逻辑代码:
import java.util.*; import java.util.stream.Collectors; import java.util.AbstractMap.SimpleEntry; // 从接口拿到的电影列表,已反序列化为List<Movie>类型 List<Movie> movieList = ...; // 核心分组逻辑 Map<String, List<Movie>> groupedByGenre = movieList.stream() // 把单条电影按所属的所有分类拆成多个<分类, 电影>的键值对 .flatMap(movie -> movie.getGenres().stream() .map(genre -> new SimpleEntry<>(genre, movie)) ) // 按分类分组,收集对应分类下的所有电影 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
如果要输出你示例里数组套对象的JSON格式,只需要把最终的Map放到单元素List中再序列化即可:
// 直接序列化result即可得到你要求的输出格式 List<Map<String, List<Movie>>> result = Collections.singletonList(groupedByGenre);
你之前使用reduce的思路是可行的,但需要提前初始化累加的Map容器,上述flatMap拆分再分组的写法是Java Stream实现这类多标签分组需求的常用方案,逻辑更清晰,也更容易维护。
内容的提问来源于stack exchange,提问作者netx
相关产品推荐
相关产品推荐

