今天介绍一个案例,如何把一个集合里的元素List<T>,按照某个字段分组,形成Map<K, List<S>>的分组结构,其中K和S是T里面的两个字段
案例里面的Bean是一个用户关注文章的对象,有用户ID和文章ID。现在要求通过转换得到每个用户关注的文章列表的映射。
完整代码如下
import java.util.*;
import static java.util.stream.Collectors.*;
public class Main {
static class UserFocusArticle {
long userId;
long articleId;
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public long getArticleId() {
return articleId;
}
public void setArticleId(long articleId) {
this.articleId = articleId;
}
public UserFocusArticle(long userId, long articleId) {
this.userId = userId;
this.articleId = articleId;
}
}
public static void main(String[] args) {
List<UserFocusArticle> list = new ArrayList<>();
list.add(new UserFocusArticle(101, 53301));
list.add(new UserFocusArticle(101, 53302));
list.add(new UserFocusArticle(102, 53301));
list.add(new UserFocusArticle(102, 53304));
list.add(new UserFocusArticle(102, 53311));
list.add(new UserFocusArticle(102, 53333));
list.add(new UserFocusArticle(103, 53305));
list.add(new UserFocusArticle(103, 53312));
list.add(new UserFocusArticle(103, 53319));
list.add(new UserFocusArticle(104, 53311));
Map<Long, List<Long>> map = list.stream().collect(groupingBy(
UserFocusArticle::getUserId,
mapping(UserFocusArticle::getArticleId, toList())));
System.out.println(map);
}
}
输出结果
{101=[53301, 53302], 102=[53301, 53304, 53311, 53333], 103=[53305, 53312, 53319], 104=[53311]}
1条评论