Java Lambda 方式將List按照對象屬性值分組成Map


Java Lambda 方式將List按照對象屬性值分組成Map


 

有時候,需要對一個List結果集進行分組處理(按照對象中的某一個屬性值進行分組)

例如:使用三國英雄的所屬國家,進行分組英雄

1、英雄實體類(Hero)

public class Hero {
    private String name;
    private String country;

    public Hero(String name, String country) {
        this.name = name;
        this.country = country;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", country='" + country + '\'' +
                '}';
    }
}

 

2、代碼實現(Lambda方式)進行分組

package com.miracle.luna.lambda;

import com.alibaba.fastjson.JSON;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Created by Miracle Luna on 2020/5/17
 */
public class ThreeCountryLambda {
    public static void main(String[] args) {
        List<Hero> heroList =  new ArrayList<>();
        Map<String, List<Hero>> heroListMap = new HashMap<String, List<Hero>>();

        Hero liubei = new Hero("劉備", "蜀國");
        Hero zhugeliang = new Hero("諸葛亮", "蜀國");

        Hero sunce = new Hero("孫策", "吳國");
        Hero zhouyu = new Hero("周瑜", "吳國");

        Hero caocao = new Hero("曹操", "魏國");
        Hero guojia = new Hero("郭嘉", "魏國");

        heroList.add(liubei);
        heroList.add(zhugeliang);

        heroList.add(sunce);
        heroList.add(zhouyu);

        heroList.add(caocao);
        heroList.add(guojia);

        // 按照所屬國家分組
        heroListMap = heroList.stream().collect(Collectors.groupingBy(hero -> hero.getCountry()));
        System.out.println(JSON.toJSONString(heroListMap));

    }
}

 

3、運行結果

{"吳國":[{"country":"吳國","name":"孫策"},{"country":"吳國","name":"周瑜"}],"魏國":[{"country":"魏國","name":"曹操"},{"country":"魏國","name":"郭嘉"}],"蜀國":[{"country":"蜀國","name":"劉備"},{"country":"蜀國","name":"諸葛亮"}]}

 

使用JSON在線解析工具(https://www.json.cn/),查看結果如下:

{
    "吳國":[
        {
            "country":"吳國",
            "name":"孫策"
        },
        {
            "country":"吳國",
            "name":"周瑜"
        }
    ],
    "魏國":[
        {
            "country":"魏國",
            "name":"曹操"
        },
        {
            "country":"魏國",
            "name":"郭嘉"
        }
    ],
    "蜀國":[
        {
            "country":"蜀國",
            "name":"劉備"
        },
        {
            "country":"蜀國",
            "name":"諸葛亮"
        }
    ]
}

 

 

PS:

上述場景,使用傳統方式分組的話,需要遍歷List,用對象中的所屬國家,依次匹配Map中的key。

匹配上,則歸類,加到子集中,作為Map的value。

1、代碼實現(傳統方式)進行分組:

package com.miracle.luna.lambda;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Miracle Luna on 2020/5/17
 */
public class ThreeCountryTradition {
    public static void main(String[] args) {
        List<Hero> heroList =  new ArrayList<>();
        Map<String, List<Hero>> heroListMap = new HashMap<String, List<Hero>>();

        Hero liubei = new Hero("劉備", "蜀國");
        Hero zhugeliang = new Hero("諸葛亮", "蜀國");

        Hero sunce = new Hero("孫策", "吳國");
        Hero zhouyu = new Hero("周瑜", "吳國");

        Hero caocao = new Hero("曹操", "魏國");
        Hero guojia = new Hero("郭嘉", "魏國");

        heroList.add(liubei);
        heroList.add(zhugeliang);

        heroList.add(sunce);
        heroList.add(zhouyu);

        heroList.add(caocao);
        heroList.add(guojia);

        // 按照所屬國家分組
        for (Hero hero : heroList) {
            if (!heroListMap.containsKey(hero.getCountry())) {
                List<Hero> valueList = new ArrayList<>();
                valueList.add(hero);
                heroListMap.put(hero.getCountry(), valueList);
            } else {
                heroListMap.get(hero.getCountry()).add(hero);
            }
        }
        System.out.println(JSON.toJSONString(heroListMap));
    }
}

 

2、運行結果:

{"吳國":[{"country":"吳國","name":"孫策"},{"country":"吳國","name":"周瑜"}],"蜀國":[{"country":"蜀國","name":"劉備"},{"country":"蜀國","name":"諸葛亮"}],"魏國":[{"country":"魏國","name":"曹操"},{"country":"魏國","name":"郭嘉"}]}

 

{
    "吳國":[
        {
            "country":"吳國",
            "name":"孫策"
        },
        {
            "country":"吳國",
            "name":"周瑜"
        }
    ],
    "蜀國":[
        {
            "country":"蜀國",
            "name":"劉備"
        },
        {
            "country":"蜀國",
            "name":"諸葛亮"
        }
    ],
    "魏國":[
        {
            "country":"魏國",
            "name":"曹操"
        },
        {
            "country":"魏國",
            "name":"郭嘉"
        }
    ]
}

 

 

總結:

通過兩種實現方式的代碼對比,可以看出:Lambda方式邏輯清晰代碼更加簡潔

強烈推薦大家使用!!!

希望能幫到需要的小伙伴,謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM