今天介绍一个案例,如何把一个集合里的元素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]}