欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?Stream?流中?Collectors.toMap?的用法詳解

 更新時(shí)間:2024年01月19日 14:28:37   作者:致最長的電影  
這篇文章主要介紹了Stream?流中?Collectors.toMap?的用法,Collectors.toMap()方法是把List轉(zhuǎn)Map的操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、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. keyMapperKey 的映射函數(shù),Student:getId 表示選擇 Student 的 getId 作為 map 的 key 值。

2. valueMapperValue的映射函數(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. mapSupplierMap 構(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)用解析

    這篇文章主要介紹了JAVA中的延遲隊(duì)列DelayQueue應(yīng)用解析,DelayQueue是一個(gè)根據(jù)元素的到期時(shí)間來排序的隊(duì)列,而并非是一般的隊(duì)列那樣先進(jìn)先出,最快過期的元素排在隊(duì)首,越晚到期的元素排得越后,需要的朋友可以參考下
    2023-12-12
  • springBoot 插件工具熱部署 Devtools的步驟詳解

    springBoot 插件工具熱部署 Devtools的步驟詳解

    這篇文章主要介紹了springBoot 插件工具 熱部署 Devtools,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 關(guān)于javaWeb中405錯(cuò)誤的解決方法

    關(guān)于javaWeb中405錯(cuò)誤的解決方法

    下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯(cuò)誤的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • java實(shí)現(xiàn)九宮格游戲

    java實(shí)現(xiàn)九宮格游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)九宮格游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例

    SSM項(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ā)工作的Java庫lombok及注解的使用學(xué)習(xí)

    不久前發(fā)現(xiàn)有一個(gè)java第三方庫可以在一定程度上幫助我們從體力勞動(dòng)中解救出來,它就是lombok。它提供了一些簡單的注解,并以此來消除java中臃腫的模版代碼。本文對于一些常用到的注解做了一個(gè)簡要的記錄,希望有更多的人enjoy it
    2022-07-07
  • java  HashMap和HashTable的區(qū)別詳解

    java HashMap和HashTable的區(qū)別詳解

    這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 一文帶你吃透Java中的String類

    一文帶你吃透Java中的String類

    在 Java 中,字符串是一種常見的數(shù)據(jù)類型,經(jīng)常用于存儲(chǔ)一些文本信息,而String類則是Java提供的專門用于字符串操作的類,本文就來和大家聊聊String類的常用方法與實(shí)現(xiàn)原理吧
    2023-05-05
  • Java簡單模擬實(shí)現(xiàn)一個(gè)線程池

    Java簡單模擬實(shí)現(xiàn)一個(gè)線程池

    本文主要介紹了Java簡單模擬實(shí)現(xiàn)一個(gè)線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Java源碼解析之詳解ReentrantLock

    Java源碼解析之詳解ReentrantLock

    今天給大家?guī)淼氖顷P(guān)于Java并發(fā)的相關(guān)知識(shí),文章圍繞著ReentrantLock源碼展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論