Java?Stream?流中?Collectors.toMap?的用法詳解
一、Collectors.toMap 方法使用技巧
Collectors.toMap() 方法是把 List 轉(zhuǎn) Map 的操作
二、代碼案例
1、demo案例
public static void main(String[] args) { List<Student> list = Arrays.asList( new Student(1, "張三", 20, "29.8"), new Student(2, "李四", 25, "29.5"), new Student(3, "趙武", 23, "30.8"), new Student(4, "王六", 22, "31.8") ); list 打印輸出為:[ Student(id=1, name=張三, age=20, score=29.8), Student(id=2, name=李四, age=25, score=29.5), Student(id=3, name=趙武, age=23, score=30.8), Student(id=4, name=王六, age=22, score=31.8) ] /** * id 作為 map 的key,name 作為 value * 結(jié)果集: {1=張三, 2=李四, 3=趙武, 4=王六} */ Map<Integer, String> collect = list.stream() .collect(Collectors.toMap(Student::getId, Student::getName)); System.out.println(collect); /** * id 作為 map 的 key,Student 對象作為 map 的 value * 結(jié)果集: {1=Student(id=1, name=張三, age=20, score=29.8), 2=Student(id=2, name=李四, age=25, score=29.5), 3=Student(id=3, name=趙武, age=23, score=30.8), 4=Student(id=4, name=王六, age=22, score=31.8)} */ Map<Integer, Student> collect1 = list.stream() .collect(Collectors.toMap(Student::getId, v -> v)); System.out.println(collect1); /** * id 作為 map 的 key,Student 對象作為 map 的 value * 結(jié)果集: {1=Student(id=1, name=張三, age=20, score=29.8), 2=Student(id=2, name=李四, age=25, score=29.5), 3=Student(id=3, name=趙武, age=23, score=30.8), 4=Student(id=4, name=王六, age=22, score=31.8)} */ Map<Integer, Student> collect2 = list.stream() .collect(Collectors.toMap(Student::getId, Function.identity())); System.out.println(collect2); }
1.1、如果不是對象,是數(shù)組,怎么轉(zhuǎn)成map?
String typeBanner = "A=1,B=2,C=3"; String[] typeBannerArray = typeBanner.split(","); System.out.println(Arrays.toString(typeBannerArray)); // [A=1, B=2, C=3] Map<String, String> typeBannerMap = Arrays.stream(typeBannerArray).collect(Collectors.toMap( (array) -> array.split("=")[0], (array) -> array.split("=")[1] )); System.out.println(typeBannerMap); // {A=1, B=2, C=3}
2、當(dāng) map 上述 id 如果重復(fù),會(huì)報(bào)主鍵重復(fù)異常,解決辦法:
按照規(guī)范來寫的話,最好所有toMap,都要將這個(gè)異常提前考慮進(jìn)去,不然有時(shí)候會(huì)報(bào)重復(fù)主鍵異常,這也是正例的寫法,上面的屬于反例的寫法。
2.1、Collectors.toMap 有三個(gè)重載方法:
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper); toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction); toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
參數(shù)解釋:
1. keyMapper
:Key
的映射函數(shù),Student:getId 表示選擇 Student 的 getId 作為 map 的 key 值。
2. valueMapper
:Value
的映射函數(shù),F(xiàn)unction.identity() 表示選擇將原來的對象作為 Map 的value 值。
3. mergeFunction
:當(dāng) Key
沖突時(shí),調(diào)用的合并方法。(n1,n2)->n1 中,如果 n1 與 n2 的 key 值相同,選擇 n1 作為那個(gè) key 所對應(yīng)的 value 值。
4. mapSupplier
:Map
構(gòu)造器,在需要返回特定的 Map
時(shí)使用。第四個(gè)參數(shù) mapSupplier
用于返回一個(gè)任意類型的 Map 實(shí)例,比如我們希望返回的 Map
是根據(jù) Key 排序的。TreeMap::new
public static void main(String[] args) { List<Student> list = Arrays.asList( new Student(1, "張三", 20, "29.8"), new Student(2, "李四", 25, "29.5"), new Student(1, "趙武", 23, "30.8"), new Student(4, "王六", 22, "31.8") ); /** * id 作為 map 的key,重復(fù) id 的 name 合并作為 value * 結(jié)果集: {1=張三,趙武, 2=李四, 4=王六} */ Map<Integer, String> collect = list.stream() .collect(Collectors.toMap(Student::getId, Student::getName, (n1, n2) -> n1 +","+ n2)); System.out.println(collect); /** * 取前面一個(gè) Student 對象 * 結(jié)果集: {1=Student(id=1, name=張三, age=20, score=29.8), 2=Student(id=2, name=李四, age=25, score=29.5), 4=Student(id=4, name=王六, age=22, score=31.8)} */ Map<Integer, Student> collect1 = list.stream() .collect(Collectors.toMap(Student::getId, Function.identity(), (n1, n2) -> n1)); System.out.println(collect1); /** * 取后面一個(gè) Student 對象 * 結(jié)果集: {1=Student(id=1, name=趙武, age=23, score=30.8), 2=Student(id=2, name=李四, age=25, score=29.5), 4=Student(id=4, name=王六, age=22, score=31.8)} */ Map<Integer, Student> collect2 = list.stream() .collect(Collectors.toMap(Student::getId, Function.identity(), (n1, n2) -> n2, TreeMap::new)); System.out.println(collect2); }
寫案例遇到的問題有,上述第一個(gè)輸出,如果寫成 n1 + n2 ,map 第二個(gè)參數(shù)類型是對象或者是list集合,都是顯示編譯報(bào)錯(cuò)狀態(tài)。
到此這篇關(guān)于Stream 流中 Collectors.toMap 的用法的文章就介紹到這了,更多相關(guān)Stream 流 Collectors.toMap用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA中的延遲隊(duì)列DelayQueue應(yīng)用解析
這篇文章主要介紹了JAVA中的延遲隊(duì)列DelayQueue應(yīng)用解析,DelayQueue是一個(gè)根據(jù)元素的到期時(shí)間來排序的隊(duì)列,而并非是一般的隊(duì)列那樣先進(jìn)先出,最快過期的元素排在隊(duì)首,越晚到期的元素排得越后,需要的朋友可以參考下2023-12-12springBoot 插件工具熱部署 Devtools的步驟詳解
這篇文章主要介紹了springBoot 插件工具 熱部署 Devtools,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10關(guān)于javaWeb中405錯(cuò)誤的解決方法
下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯(cuò)誤的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例
這篇文章主要介紹了SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04減少代碼開發(fā)工作的Java庫lombok及注解的使用學(xué)習(xí)
不久前發(fā)現(xiàn)有一個(gè)java第三方庫可以在一定程度上幫助我們從體力勞動(dòng)中解救出來,它就是lombok。它提供了一些簡單的注解,并以此來消除java中臃腫的模版代碼。本文對于一些常用到的注解做了一個(gè)簡要的記錄,希望有更多的人enjoy it2022-07-07java HashMap和HashTable的區(qū)別詳解
這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12Java簡單模擬實(shí)現(xiàn)一個(gè)線程池
本文主要介紹了Java簡單模擬實(shí)現(xiàn)一個(gè)線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01