Java stream groupingBy 基本用法

來看看Java stream提供的分組 - groupingBy

一. 基本用法 - 接收一個(gè)參數(shù)

它接收一個(gè)函數(shù)作為參數(shù)歉嗓,也就是說可以傳lambda表達(dá)式進(jìn)來。

    public static <T, K> Collector<T, ?, Map<K, List<T>>>
    groupingBy(Function<? super T, ? extends K> classifier) {
        return groupingBy(classifier, toList());
    }

UserList.stream().collect(Collectors.groupingBy( 函數(shù) ))甘晤,返回的是一個(gè)map柠辞,key為分組的值鲸阔,value為list订晌,包含組內(nèi)的元素。

1. 簡(jiǎn)單類型分組
    @Test
    public void test01() {
        List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 1, 2, 3);
        Map<Integer, List<Integer>> collect = intList.stream().collect(Collectors.groupingBy(e -> e%2));
        System.out.println(collect);
    }
2. 對(duì)象饿自,按一個(gè)屬性分組

這里用到的User::getEducation汰翠,class名字+雙冒號(hào)+方法名龄坪,等同于lambda表達(dá)式e -> e.getEduction()

    @Test
    public void test02() {
        List<User> userList = Arrays.asList(new User(0, "zhangsan", "zhangsan@qq.com", 20, "High School"),
                new User(1, "lisi", "lisi@qq.com", 20, "High School"),
                new User(2, "wangwu", "wangwu@qq.com", 20, "High School"),
                new User(3, "lilei", "lilei@qq.com", 25, "Graduate"),
                new User(4, "hanmeimei", "hanmeimei@qq.com", 26, "Graduate"),
                new User(5, "lucy", "lucy@qq.com", 25, "Graduate"));

        Map<String, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::getEducation));

        System.out.println(collect);
    }
3. 對(duì)象,按多個(gè)屬性分組

嵌套分組 (groupingBy 接收兩個(gè)參數(shù))

        Map<Integer, Map<String, List<User>>> collect =
                userList.stream().collect(Collectors.groupingBy(User::getAge, Collectors.groupingBy(User::getEducation)));

        System.out.println(collect.get(20).get("High School"));
4. 按整個(gè)對(duì)象分組

User::new方法進(jìn)行分組复唤,它會(huì)調(diào)用構(gòu)造方法public User(User user)健田,并依賴于hashcodeequals方法來判斷對(duì)象是否相等,進(jìn)而進(jìn)行分組佛纫。如果有一些特殊的邏輯對(duì)對(duì)象進(jìn)行分組妓局,可以重寫hashcodeequals方法。

Map<User, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::new));
    public User(User user) {
        this.id = user.id;
        this.name = user.name;
        this.email = user.email;
        this.age = user.age;
        this.education = user.education;
    }
5. 處理null key
        Map<String, List<User>> collect = userList.stream().collect(Collectors.groupingBy(e -> {
            if (e.getEducation() == null || "".equals(e.getEducation())) {
                return "";
            }
            return e.getEducation();
        }));

二. 接收兩個(gè)參數(shù) - 對(duì)groupingby結(jié)果集進(jìn)一步處理

    public static <T, K, A, D>
    Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
                                          Collector<? super T, A, D> downstream) {
        return groupingBy(classifier, HashMap::new, downstream);
    }
1. 計(jì)算平均值
        Map<String, Double> collect = 
                userList.stream().collect(Collectors.groupingBy(User::getEducation, Collectors.averagingInt(User::getAge)));
{High School=20.0, Graduate=25.333333333333332}
2. count
        Map<String, Long> collect =
                userList.stream().collect(Collectors.groupingBy(User::getEducation, Collectors.counting()));
{High School=3, Graduate=3}
3. 求和
        Map<String, Integer> collect =
                userList.stream().collect(Collectors.groupingBy(User::getEducation, Collectors.summingInt(User::getAge)));
{High School=60, Graduate=76}

三. 接收三個(gè)參數(shù)

添加了對(duì)結(jié)果Map的生成方式呈宇,默認(rèn)是HashMap

    public static <T, K, D, A, M extends Map<K, D>>
    Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
                                  Supplier<M> mapFactory,
                                  Collector<? super T, A, D> downstream)

例好爬,用TreeMap對(duì)key進(jìn)行排序:

        Map<String, Set<String>> namesByEdu =
                userList.stream().collect(Collectors.groupingBy(User::getEducation, TreeMap::new, mapping(User::getName,Collectors.toSet())));

        System.out.println(namesByEdu);
{Graduate=[lilei, hanmeimei, lucy], High School=[lisi, zhangsan]}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甥啄,隨后出現(xiàn)的幾起案子存炮,更是在濱河造成了極大的恐慌,老刑警劉巖蜈漓,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僵蛛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迎变,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門飘言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣形,“玉大人,你說我怎么就攤上這事姿鸿∽晃猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵苛预,是天一觀的道長(zhǎng)句狼。 經(jīng)常有香客問我,道長(zhǎng)热某,這世上最難降的妖魔是什么腻菇? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮昔馋,結(jié)果婚禮上筹吐,老公的妹妹穿的比我還像新娘。我一直安慰自己秘遏,他們只是感情好丘薛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邦危,像睡著了一般洋侨。 火紅的嫁衣襯著肌膚如雪舍扰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天希坚,我揣著相機(jī)與錄音边苹,去河邊找鬼。 笑死吏够,一個(gè)胖子當(dāng)著我的面吹牛勾给,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锅知,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼播急,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了售睹?” 一聲冷哼從身側(cè)響起桩警,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昌妹,沒想到半個(gè)月后捶枢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飞崖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年烂叔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固歪。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒜鸡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牢裳,到底是詐尸還是另有隱情逢防,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布蒲讯,位于F島的核電站忘朝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏判帮。R本人自食惡果不足惜局嘁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晦墙。 院中可真熱鬧导狡,春花似錦、人聲如沸偎痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枚赡,卻和暖如春氓癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贫橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工贪婉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卢肃。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓疲迂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莫湘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尤蒿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容