自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Stream 與 Map:toMap() 的使用需謹(jǐn)慎

開發(fā) 前端
當(dāng)完成一次流處理之后需要返回一個(gè)集成對(duì)象時(shí),已經(jīng)肌肉記憶的敲下 collect(Collectors.toList()) 或者 collect(Collectors.toSet())。你可能會(huì)想,toList 和 toSet 都這么便捷順手了,又怎么能少得了 toMap() 呢。

在 JDK 8 中 Java 引入了讓人欲罷不能的 stream 流處理,可以說已經(jīng)成為了我日常開發(fā)中不可或缺的一部分。

當(dāng)完成一次流處理之后需要返回一個(gè)集成對(duì)象時(shí),已經(jīng)肌肉記憶的敲下 collect(Collectors.toList()) 或者 collect(Collectors.toSet())。你可能會(huì)想,toList 和 toSet 都這么便捷順手了,又怎么能少得了 toMap() 呢。

答應(yīng)我,一定打消你的這個(gè)想法,否則這將成為你噩夢的開端。

什么?你不信,沒有什么比代碼讓人更痛徹心扉,讓我們直接上代碼。

讓我們先準(zhǔn)備一個(gè)用戶實(shí)體類。

@Data
@AllArgsConstructor  
public class User {  
  
    private int id;  
    
    private String name;  
}

假設(shè)有這么一個(gè)場景,你從數(shù)據(jù)庫讀取 User 集合,你需要將其轉(zhuǎn)為 Map 結(jié)構(gòu)數(shù)據(jù),key 和 value 分別為 user 的 id 和 name。

很快,你啪的一下就寫出了下面的代碼:

public class UserTest {
    @Test
    public void demo() {  
        List<User> userList = new ArrayList<>();
        // 模擬數(shù)據(jù)
        userList.add(new User(1, "Alex"));  
        userList.add(new User(1, "Beth"));

        Map<Integer, String> map = userList.stream()  
                .collect(Collectors.toMap(User::getId, User::getName));  
        System.out.println(map);  
    }
}

運(yùn)行程序,你已經(jīng)想好了開始怎么摸魚,結(jié)果啪的一下 IllegalStateException 報(bào)錯(cuò)就拍你臉上,你定睛一看怎么提示 Key 值重復(fù)。

作為優(yōu)秀的八股文選手,你清楚的記得 HashMap 對(duì)象 Key 重復(fù)是進(jìn)行替換。你不信邪,斷點(diǎn)一打,堆棧一看,碩大的 uniqKeys 擺在了面前,憑借四級(jí) 424 分的優(yōu)秀戰(zhàn)績你趕緊點(diǎn)開一看,誰家好人 map key 還要去重判斷啊。

圖片圖片

好好好,這么玩是吧,你轉(zhuǎn)身打開瀏覽器一搜,原來需要自己手動(dòng)處理重復(fù)場景,啪的一下你又重新改了一下代碼:

public class UserTest {
    @Test
    public void demo() {  
        List<User> userList = new ArrayList<>();
        // 模擬數(shù)據(jù)
        userList.add(new User(1, "Alex"));  
        userList.add(new User(2, null));
        
        Map<Integer, String> map = userList.stream()  
                .collect(Collectors.toMap(User::getId, User::getName, (oldData, newData) -> newData));  
        System.out.println(map);  
    }
}

再次執(zhí)行程序,你似乎已經(jīng)看到知乎的摸魚貼在向你招手了,結(jié)果啪的一下 NPE 又拍在你那笑容漸漸消失的臉上。

靜下心來,本著什么大風(fēng)大浪我沒見過的心態(tài),斷點(diǎn)堆棧一氣呵成,而下一秒你又望著代碼陷入了沉思,我是誰?我在干什么?

圖片圖片

圖片圖片

鼓起勇氣,你還不信今天就過不去這個(gè)坎了,大手一揮,又一段優(yōu)雅的代碼孕育而生。

public class UserTest {
    @Test
    public void demo() {  
        List<User> userList = new ArrayList<>();
        // 模擬數(shù)據(jù)
        userList.add(new User(1, "Alex"));  
        userList.add(new User(1, "Beth"));
        userList.add(new User(2, null));
        
        Map<Integer, String> map = userList.stream()  
                .collect(Collectors.toMap(  
                    User::getId,  
                    it -> Optional.ofNullable(it.getName()).orElse(""),  
                    (oldData, newData) -> newData)  
                );
        System.out.println(map);  
    }
}

優(yōu)雅,真是太優(yōu)雅了,又是 Stream 又是 Optional,可謂是狠狠拿捏技術(shù)博文的 G 點(diǎn)了。

這時(shí)候你回頭一看,我需要是什么來著?這 TM 不是一個(gè)循環(huán)就萬事大吉了嗎,不信邪的你回歸初心,回歸了 for 循環(huán)的懷抱,又寫了一版。

public class UserTest {
    @Test
    public void demo() {  
        List<User> userList = new ArrayList<>();
        // 模擬數(shù)據(jù)
        userList.add(new User(1, "Alex"));  
        userList.add(new User(1, "Beth"));
        userList.add(new User(2, null));
  
        Map<Integer, String> map = new HashMap<>();  
        userList.forEach(it -> {  
            map.put(it.getId(), it.getName());  
        });  
        System.out.println(map);
    }
}

看著運(yùn)行完美無缺的代碼,你一時(shí)陷入了沉思,數(shù)分鐘過去了,你刪除了 for 循環(huán),換上 Stream 與 Optional 不羈的外衣,安心的提交了代碼,這口細(xì)糠一定也要讓好同事去嘗一嘗。

就這,你就要拋棄 toMap?你這讓設(shè)計(jì) toMap 的人,臉往哪擱。

解決的辦法有很多,其中最簡單的之一就是,給它第三個(gè)合并參數(shù),解決沖突。因?yàn)镃ollectors.toMap這個(gè)方法其實(shí)是有三個(gè)參數(shù)的,第一個(gè)是key,第二個(gè)是value,第三個(gè)是發(fā)生沖突的合并規(guī)則。默認(rèn)采用的就是沖突之后拋出異常的處理。

責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2009-02-19 20:36:30

VistavLite副作用

2010-07-05 09:46:42

Visual Stud

2024-07-10 10:15:43

2010-11-15 10:22:35

中工網(wǎng)綜合

2020-03-13 17:59:06

OA二開CIO觀點(diǎn)

2013-06-07 10:31:46

CIO虛擬化

2009-08-16 09:25:55

Windows 7系統(tǒng)升級(jí)

2009-12-25 10:38:23

作戰(zhàn)計(jì)劃敏感部門USB使用

2018-01-29 09:28:44

2012-12-13 21:34:30

2015-04-20 09:31:41

初創(chuàng)企業(yè)融資風(fēng)險(xiǎn)額度

2013-04-12 10:00:40

美海軍CIO云計(jì)算

2011-10-19 09:19:23

云計(jì)算數(shù)據(jù)安全

2016-02-25 10:11:48

2010-11-23 14:09:39

數(shù)據(jù)中心托管

2016-05-31 14:28:21

云計(jì)算混合云

2016-10-28 15:53:18

2013-09-09 18:21:14

2013-01-22 09:31:33

2010-08-18 10:15:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)