Java?Stream如何將List分組成Map或LinkedHashMap
前言
在Java中,使用Stream API可以輕松地對集合進行操作,包括將List轉(zhuǎn)換為Map或LinkedHashMap。本篇博客將演示如何利用Java Stream實現(xiàn)這兩種轉(zhuǎn)換,同時假設(shè)List中的元素是User對象。
1. 數(shù)據(jù)準(zhǔn)備
List<User> list = new ArrayList<>(); list.add(new User(1, "張三", "我是張三01")); list.add(new User(2, "張三", "我是張三02")); list.add(new User(3, "李四", "我是李四01")); list.add(new User(4, "李四", "我是李四02")); list.add(new User(5, "王五", "我是王五01")); list.add(new User(6, "王五", "我是王五02"));
2. List轉(zhuǎn)Map(無序-默認(rèn))
List轉(zhuǎn)Map有兩種Map格式,分別是 Map<String, User>和 Map<String, List>,下面我將分別展示:
2.1 List轉(zhuǎn)Map<String, User>
轉(zhuǎn)換成Map<String, User>我們需要使用到Collectors.toMap方法:
//通過名字進行分組,如果名字重復(fù)的話只取第一個:List轉(zhuǎn)Map<String, User> Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1)); System.out.println(map01);
執(zhí)行結(jié)果:
{
李四=User(id=3, name=李四, note=我是李四01),
張三=User(id=1, name=張三, note=我是張三01),
王五=User(id=5, name=王五, note=我是王五01)
}
2.2 List轉(zhuǎn)Map<String, List<User>>
轉(zhuǎn)換成Map<String, List<User>>我們需要使用到Collectors.groupingBy方法:
//通過名字進行分組,如果名字重復(fù)的話就分組成List:List轉(zhuǎn)Map<String, List<User>> Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName)); System.out.println(map02);
執(zhí)行結(jié)果:
{
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)],
張三=[User(id=1, name=張三, note=我是張三01), User(id=2, name=張三, note=我是張三02)],
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}
我們可以看到:map中打印出來的執(zhí)行結(jié)果并沒有按照List中添加的順序打印的
3. List轉(zhuǎn)LinkedHashMap(有序)
List轉(zhuǎn)LinkedHashMap也有兩種Map格式,分別是 LinkedHashMap<String, User>和 LinkedHashMap<String, List>,下面我將分別展示:
3.1 List轉(zhuǎn)LinkedHashMap<String, User>
轉(zhuǎn)換成LinkedHashMap<String, User>我們需要使用到Collectors.toMap方法:
//通過名字進行分組,如果名字重復(fù)的話只取第一個:List轉(zhuǎn)LinkedHashMap<String, User> Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new)); System.out.println(map03);
執(zhí)行結(jié)果:
{
張三=User(id=1, name=張三, note=我是張三01),
李四=User(id=3, name=李四, note=我是李四01),
王五=User(id=5, name=王五, note=我是王五01)
}
3.2 List轉(zhuǎn)LinkedHashMap<String, List<User>>
轉(zhuǎn)換成LinkedHashMap<String, List<User>>我們需要使用到Collectors.groupingBy方法:
//通過名字進行分組,如果名字重復(fù)的話就分組成List:List轉(zhuǎn)LinkedHashMap<String, List<User>> Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList())); System.out.println(map04);
執(zhí)行結(jié)果:
{
張三=[User(id=1, name=張三, note=我是張三01), User(id=2, name=張三, note=我是張三02)],
李四=[User(id=3, name=李四, note=我是李四01), User(id=4, name=李四, note=我是李四02)],
王五=[User(id=5, name=王五, note=我是王五01), User(id=6, name=王五, note=我是王五02)]
}
我們可以看到:map中打印出來的執(zhí)行結(jié)果是按照List中添加的順序打印的
4. 總結(jié)
在List轉(zhuǎn)Map的過程中:
- 如果我們對Map中的順序沒要求,我們可以通過stream流將List轉(zhuǎn)換為默認(rèn)的HMap即可
- 如果我們對Map中的順序有要求,我們可以通過stream流將List轉(zhuǎn)換為LinkedHashMap才行
5. 全部代碼
public static void test1() { List<User> list = new ArrayList<>(); list.add(new User(1, "張三", "我是張三01")); list.add(new User(2, "張三", "我是張三02")); list.add(new User(3, "李四", "我是李四01")); list.add(new User(4, "李四", "我是李四02")); list.add(new User(5, "王五", "我是王五01")); list.add(new User(6, "王五", "我是王五02")); //通過名字進行分組,如果名字重復(fù)的話只取第一個:List轉(zhuǎn)Map<String, User> Map<String, User> map01 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1)); System.out.println(map01); //通過名字進行分組,如果名字重復(fù)的話就分組成List:List轉(zhuǎn)Map<String, List<User>> Map<String, List<User>> map02 = list.stream().collect(Collectors.groupingBy(User::getName)); System.out.println(map02); //通過名字進行分組,如果名字重復(fù)的話只取第一個:List轉(zhuǎn)LinkedHashMap<String, User> Map<String, User> map03 = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (u1, u2) -> u1, LinkedHashMap::new)); System.out.println(map03); //通過名字進行分組,如果名字重復(fù)的話就分組成List:List轉(zhuǎn)LinkedHashMap<String, List<User>> Map<String, List<User>> map04 = list.stream().collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList())); System.out.println(map04); }
public class User { private Integer id; private String name; private String note; }
總結(jié)
到此這篇關(guān)于Java Stream如何將List分組成Map或LinkedHashMap的文章就介紹到這了,更多相關(guān)List分組成Map或LinkedHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC獲取查詢參數(shù)及路徑參數(shù)代碼實例
這篇文章主要介紹了Spring MVC獲取查詢參數(shù)及路徑參數(shù)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02java運行jar包提示?“XXX中沒有主清單屬性”?"找不到主類”兩種解決辦法
本文主要介紹了java運行jar包提示?“XXX中沒有主清單屬性”?"找不到主類”兩種解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Java虛擬機內(nèi)存結(jié)構(gòu)及編碼實戰(zhàn)分享
這篇文章主要介紹了Java虛擬機內(nèi)存結(jié)構(gòu)及編碼實戰(zhàn)分享,文章圍繞詳細(xì)主題展開相關(guān)資料具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04使用GSON庫將Java中的map鍵值對應(yīng)結(jié)構(gòu)對象轉(zhuǎn)換為JSON
GSON是由Google開發(fā)并開源的實現(xiàn)Java對象與JSON之間相互轉(zhuǎn)換功能的類庫,這里我們來看一下使用GSON庫將Java中的map鍵值對應(yīng)結(jié)構(gòu)對象轉(zhuǎn)換為JSON的示例:2016-06-06JDK、J2EE、J2SE、J2ME四個易混淆概念區(qū)分
這篇文章將向你詳細(xì)介紹JDK、J2EE、J2SE、J2ME的概念以及他們的關(guān)系區(qū)別。2015-09-09