1. Stream很好,Map很酷,但答應(yīng)我別用toMap()

        共 6259字,需瀏覽 13分鐘

         ·

        2024-07-10 08:56

        大家好,我是小富

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

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

        小富學(xué)習(xí)網(wǎng)站:https://xiaofucode.com

        答應(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ù),keyvalue 分別為 useridname。

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

        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 對象 Key 重復(fù)是進(jìn)行替換。你不信邪,斷點(diǎn)一打,堆棧一看,碩大的 uniqKeys 擺在了面前,憑借四級 424 分的優(yōu)秀戰(zhàn)績你頓時(shí)菊花一緊,點(diǎn)開一看,誰家好人 map key 還要去重判斷啊。

        好好好,這么玩是吧,你轉(zhuǎn)身打開瀏覽器一搜,原來需要自己手動處理重復(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(2null));
                
                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(2null));
                
                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(2null));
          
                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),換上 StreamOptional 不羈的外衣,安心的提交了代碼,這口細(xì)糠一定也要讓好同事去嘗一嘗。

        最后說一句(別白嫖,求關(guān)注)

        點(diǎn)贊、在看、轉(zhuǎn)發(fā)收藏,你的支持就是我堅(jiān)持下去的最大動力!

        瀏覽 30
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 乌克兰xxxxx少妇精品二区 | 精品少妇一区二区三区在线 | 国产羞羞网站 | 97啪啪| 久久久999国产 |