日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Stream很好,Map很酷,但答應我別用toMap()

來源: 責編: 時間:2024-07-10 17:58:37 712觀看
導讀在 JDK 8 中 Java 引入了讓人欲罷不能的 stream 流處理,可以說已經成為了我日常開發中不可或缺的一部分。當完成一次流處理之后需要返回一個集成對象時,已經肌肉記憶的敲下 collect(Collectors.toList()) 或者 collect(

在 JDK 8 中 Java 引入了讓人欲罷不能的 stream 流處理,可以說已經成為了我日常開發中不可或缺的一部分。Ih028資訊網——每日最新資訊28at.com

當完成一次流處理之后需要返回一個集成對象時,已經肌肉記憶的敲下 collect(Collectors.toList()) 或者 collect(Collectors.toSet())。你可能會想,toList 和 toSet 都這么便捷順手了,當又怎么能少得了 toMap() 呢。Ih028資訊網——每日最新資訊28at.com

答應我,一定打消你的這個想法,否則這將成為你噩夢的開端。Ih028資訊網——每日最新資訊28at.com

Ih028資訊網——每日最新資訊28at.com

什么?你不信,沒有什么比代碼讓人更痛徹心扉,讓我們直接上代碼。Ih028資訊網——每日最新資訊28at.com

讓我們先準備一個用戶實體類。Ih028資訊網——每日最新資訊28at.com

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

假設有這么一個場景,你從數據庫讀取 User 集合,你需要將其轉為 Map 結構數據,key 和 value 分別為 user 的 id 和 name。Ih028資訊網——每日最新資訊28at.com

很快,你啪的一下就寫出了下面的代碼:Ih028資訊網——每日最新資訊28at.com

public class UserTest {    @Test    public void demo() {          List<User> userList = new ArrayList<>();        // 模擬數據        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);      }}

運行程序,你已經想好了開始怎么摸魚,結果啪的一下 IllegalStateException 報錯就拍你臉上,你定睛一看怎么提示 Key 值重復。Ih028資訊網——每日最新資訊28at.com

Ih028資訊網——每日最新資訊28at.com

作為優秀的八股文選手,你清楚的記得 HashMap 對象 Key 重復是進行替換。你不信邪,斷點一打,堆棧一看,碩大的 uniqKeys 擺在了面前,憑借四級 424 分的優秀戰績你頓時菊花一緊,點開一看,誰家好人 map key 還要去重判斷啊。Ih028資訊網——每日最新資訊28at.com

圖片圖片Ih028資訊網——每日最新資訊28at.com

好好好,這么玩是吧,你轉身打開瀏覽器一搜,原來需要自己手動處理重復場景,啪的一下你又重新改了一下代碼:Ih028資訊網——每日最新資訊28at.com

public class UserTest {    @Test    public void demo() {          List<User> userList = new ArrayList<>();        // 模擬數據        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);      }}

再次執行程序,你似乎已經看到知乎的摸魚貼在向你招手了,結果啪的一下 NPE 又拍在你那笑容漸漸消失的臉上。Ih028資訊網——每日最新資訊28at.com

Ih028資訊網——每日最新資訊28at.com

靜下心來,本著什么大風大浪我沒見過的心態,斷點堆棧一氣呵成,而下一秒你又望著代碼陷入了沉思,我是誰?我在干什么?Ih028資訊網——每日最新資訊28at.com

圖片圖片Ih028資訊網——每日最新資訊28at.com

圖片圖片Ih028資訊網——每日最新資訊28at.com

鼓起勇氣,你還不信今天就過不去這個坎了,大手一揮,又一段優雅的代碼孕育而生。Ih028資訊網——每日最新資訊28at.com

public class UserTest {    @Test    public void demo() {          List<User> userList = new ArrayList<>();        // 模擬數據        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);      }}

優雅,真是太優雅了,又是 Stream 又是 Optional,可謂是狠狠拿捏技術博文的 G 點了。Ih028資訊網——每日最新資訊28at.com

這時候你回頭一看,我需要是什么來著?這 TM 不是一個循環就萬事大吉了嗎,不信邪的你回歸初心,回歸了 for 循環的懷抱,又寫了一版。Ih028資訊網——每日最新資訊28at.com

public class UserTest {    @Test    public void demo() {          List<User> userList = new ArrayList<>();        // 模擬數據        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);    }}

看著運行完美無缺的代碼,你一時陷入了沉思,數分鐘過去了,你刪除了 for 循環,換上 Stream 與 Optional 不羈的外衣,安心的提交了代碼,這口細糠一定也要讓好同事去嘗一嘗。Ih028資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100191-0.htmlStream很好,Map很酷,但答應我別用toMap()

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 最近很火的Vue Vine是如何實現一個文件中寫多個組件

下一篇: Rust模式:使用Box::leak創建一個&amp;'static引用

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 吴忠市| 靖边县| 凉山| 南充市| 卢龙县| 青河县| 灌南县| 溆浦县| 同江市| 高雄县| 屏山县| 临清市| 玉田县| 南澳县| 论坛| 峡江县| 台南市| 曲沃县| 淮阳县| 达州市| 承德县| 大新县| 师宗县| 昌宁县| 日土县| 临泽县| 克什克腾旗| 彰武县| 长岭县| 城步| 榆树市| 张家川| 民乐县| 玉林市| 泰来县| 平安县| 巴南区| 锦州市| 稷山县| 承德市| 靖安县|