最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8?Collectors.toMap()?的兩種用法

 更新時(shí)間:2025年09月28日 10:21:46   作者:不愿放下技術(shù)的小趙  
Collectors.toMap():JDK8?中提供,用于將Stream流轉(zhuǎn)換為?Map,本文給大家介紹Java8?Collectors.toMap()?的兩種用法,感興趣的朋友一起看看吧

一、簡(jiǎn)單介紹

Collectors.toMap(): JDK8 中提供,用于將 Stream 流轉(zhuǎn)換為 Map。

用法1:根據(jù)某一屬性,對(duì)對(duì)象的實(shí)例或?qū)傩宰鲇成?/h3>

例如:使用 Stream 想要將集合的某一屬性(例如手機(jī)號(hào))作為 key,對(duì)象本身作為 value,這樣我們?cè)诟鶕?jù)屬性獲取實(shí)例或?qū)嵗钠渌麑傩詴r(shí)就可以省去遍歷每個(gè)對(duì)象的時(shí)間。

// 獲取 手機(jī)號(hào)-UserInfo 映射
Map<String, UserInfo> phoneNumberMap = list.stream().collect(Collectors.toMap(UserInfo::getPhoneNumber(), Function.identity());

用法2:根據(jù)某一屬性,對(duì)對(duì)象集合進(jìn)行去重

原始 JDK8 實(shí)現(xiàn)根據(jù)某一屬性去重:

// 查詢數(shù)據(jù)
List<UserInfo> list = userInfoMapper.getList();
// 根據(jù) 姓名 去重
list = list.stream().filter(o -> o.getName() != null).collect(
                Collectors.collectingAndThen(Collectors.toCollection(
                    () -> new TreeSet<>(Comparator.comparing(UserInfo::getName))), ArrayList<Aoo>::new));

通過 Collectors.toMap() 實(shí)現(xiàn)根據(jù)某一屬性去重:

// 查詢數(shù)據(jù)
List<UserInfo> list = userInfoMapper.getList();
// 根據(jù) 姓名 去重
Map<String, UserInfo> collect = list.stream()
    .collect(Collectors.toMap(UserInfo::getName, o -> o, (v1, v2) -> v1));
list = new ArrayList<>(collect.values());

二、Duplicate key 異常

1)異常重現(xiàn):

    public static void main(String[] args) {
        List<User> list = Arrays.asList(
                new User("張三", 15),
                new User("張三", 16));
        // 獲取 姓名-年齡 映射
        Map<String, Integer> nameMap = list.stream().collect(Collectors.toMap(User::getName, User::getAge));
        System.out.println(nameMap);
    }
    private static class User {
        private String name;
        private Integer age;
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public Integer getAge() {
            return age;
        }
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

2)異常截圖:

3)異常說明:

? Collectors.toMap() 在 key 重復(fù)的時(shí)候,是需要指定處理操作的。默認(rèn)并不會(huì)像 HashMap 一樣直接對(duì)原值進(jìn)行覆蓋。當(dāng)出現(xiàn) key 重復(fù)但沒有指定操作時(shí),就會(huì)拋出一個(gè) IllegalStateException 非法聲明異常。

4)異常處理:

? 我們只需要增加第3個(gè)參數(shù),指定當(dāng) key 重復(fù)時(shí)需要進(jìn)行的操作即可:

// 獲取 姓名-年齡 映射
// 第3個(gè)參數(shù)會(huì)執(zhí)行 Map.merge() 操作,(v1, v2) -> v1 表示重復(fù)時(shí)拋棄后面的值
Map<String, Integer> nameMap = list.stream()
    .collect(Collectors.toMap(User::getName, User::getAge, (v1, v2) -> v1));

? 運(yùn)行程序,輸出結(jié)果如下:

三、Collectors.toMap() 導(dǎo)致的空指針異常

1)異常重現(xiàn):

    public static void main(String[] args) {
        List<User> list = Arrays.asList(
                new User("張三", 15),
                new User("李四", null));
        // 獲取 姓名-年齡 映射
        Map<String, Integer> nameMap = list.stream()
            .collect(Collectors.toMap(User::getName, User::getAge, (v1, v2) -> v1));
        System.out.println(nameMap);
    }
    private static class User {
        private String name;
        private Integer age;
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public Integer getAge() {
            return age;
        }
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

2)異常截圖:

3)異常說明:

? 導(dǎo)致空指針是因?yàn)?Collectors.toMap() 底層會(huì)調(diào)用 HashMap.merge() 方法,在執(zhí)行 merge() 方法的時(shí)候會(huì)對(duì) value 進(jìn)行非空判斷,從而拋出異常:

4)異常處理:

方法一:替換 null 為一個(gè)默認(rèn)值,比如 -1

// 獲取 姓名-年齡 映射
Map<String, Integer> nameMap = list.stream()
    .collect(Collectors.toMap(User::getName, o -> Optional.ofNullable(o.getAge()).orElse(-1), (v1, v2) -> v1));

運(yùn)行程序,輸出結(jié)果如下:

方法二:調(diào)用 collect() 方法實(shí)現(xiàn)

public static void main(String[] args) {
    List<User> list = Arrays.asList(
        new User("張三", 15),
        new User("張三", 16),
        new User("李四", null));
    Map<String, Integer> nameMap = list.stream()
        .collect(HashMap::new, (m, o) -> m.put(o.getName(), userInfo.getAge()), HashMap::putAll);
    System.out.println(nameMap);
}

運(yùn)行程序,輸出結(jié)果如下:

四、總結(jié)

? 綜合以上兩種異常的出現(xiàn)情況和處理方法,考慮到代碼的可讀性,最終推薦通過如下方式使用 Collectors.toMap()

// 獲取 姓名-年齡 映射
Map<String, Integer> nameMap = list.stream()
    .collect(Collectors.toMap(User::getName, o -> Optional.ofNullable(o.getAge()).orElse(-1), (v1, v2) -> v1));

參考地址:

1.Java 8中Collectors.toMap空指針異常源碼分析,http://www.fzitv.net/program/294861hkb.htm

到此這篇關(guān)于Java8 Collectors.toMap() 的使用的文章就介紹到這了,更多相關(guān)java collectors.tomap()使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java設(shè)計(jì)模式之策略模式在促銷活動(dòng)場(chǎng)景中的使用案例

    java設(shè)計(jì)模式之策略模式在促銷活動(dòng)場(chǎng)景中的使用案例

    這篇文章主要為大家介紹了java設(shè)計(jì)模式之策略模式在促銷活動(dòng)場(chǎng)景中案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • java的equals和==的比較示例

    java的equals和==的比較示例

    這篇文章主要介紹了java的equals和==的比較示例,需要的朋友可以參考下
    2014-04-04
  • SpringBoot集成Spring security JWT實(shí)現(xiàn)接口權(quán)限認(rèn)證

    SpringBoot集成Spring security JWT實(shí)現(xiàn)接口權(quán)限認(rèn)證

    這篇文章主要介紹了SpringBoot集成Spring security JWT實(shí)現(xiàn)接口權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    我們?cè)谧鯳eb應(yīng)用的時(shí)候,請(qǐng)求處理過程中發(fā)生錯(cuò)誤是非常常見的情況。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • jstack配合top命令分析CPU飆高、程序死鎖問題

    jstack配合top命令分析CPU飆高、程序死鎖問題

    記得前段時(shí)間,同事說他們測(cè)試環(huán)境的服務(wù)器cpu使用率一直處于100%,本地又沒有什么接口調(diào)用,為什么會(huì)這樣?cpu使用率居高不下,自然是有某些線程一直占用著cpu資源,那又如何查看占用cpu較高的線程
    2021-09-09
  • springboot配置ssl后啟動(dòng)一直是端口被占用的解決

    springboot配置ssl后啟動(dòng)一直是端口被占用的解決

    這篇文章主要介紹了springboot配置ssl后啟動(dòng)一直是端口被占用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java字節(jié)流知識(shí)點(diǎn)總結(jié)

    java字節(jié)流知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于java字節(jié)流的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)參考下。
    2019-07-07
  • 關(guān)于Nacos單機(jī)啟動(dòng)的兩種方式

    關(guān)于Nacos單機(jī)啟動(dòng)的兩種方式

    這篇文章主要介紹了關(guān)于Nacos單機(jī)啟動(dòng)的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java?的訪問修飾符public,protected,private(封裝、繼承)

    Java?的訪問修飾符public,protected,private(封裝、繼承)

    這篇文章主要介紹了Java?的訪問修飾符public,protected,private(封裝、繼承),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • tomcat部署java web項(xiàng)目遇到的問題及解決方法

    tomcat部署java web項(xiàng)目遇到的問題及解決方法

    這篇文章主要介紹了tomcat部署java web項(xiàng)目遇到的問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

开原市| 玉龙| 江孜县| 甘德县| 卢氏县| 绍兴县| 衡山县| 华阴市| 新河县| 武安市| 昌吉市| 墨玉县| 县级市| 涿州市| 天祝| 萍乡市| 滨州市| 湖州市| 五寨县| 任丘市| 右玉县| 临潭县| 宜兰县| 玉门市| 清涧县| 九寨沟县| 紫金县| 射阳县| 嘉义县| 博爱县| 邯郸县| 新乡市| 北川| 九江县| 平安县| 衢州市| 若尔盖县| 宿松县| 红原县| 长治市| 连平县|