当前位置:首页 > 科技  > 软件

Stream很好,Map很酷,但答应我别用toMap()

来源: 责编: 时间:2024-07-10 17:58:37 822观看
导读在 JDK 8 中 Java 引入了让人欲罢不能的 stream 流处理,可以说已经成为了我日常开发中不可或缺的一部分。当完成一次流处理之后需要返回一个集成对象时,已经肌肉记忆的敲下 collect(Collectors.toList()) 或者 collect(

在 JDK 8 中 Java 引入了让人欲罢不能的 stream 流处理,可以说已经成为了我日常开发中不可或缺的一部分。wBC28资讯网——每日最新资讯28at.com

当完成一次流处理之后需要返回一个集成对象时,已经肌肉记忆的敲下 collect(Collectors.toList()) 或者 collect(Collectors.toSet())。你可能会想,toList 和 toSet 都这么便捷顺手了,当又怎么能少得了 toMap() 呢。wBC28资讯网——每日最新资讯28at.com

答应我,一定打消你的这个想法,否则这将成为你噩梦的开端。wBC28资讯网——每日最新资讯28at.com

wBC28资讯网——每日最新资讯28at.com

什么?你不信,没有什么比代码让人更痛彻心扉,让我们直接上代码。wBC28资讯网——每日最新资讯28at.com

让我们先准备一个用户实体类。wBC28资讯网——每日最新资讯28at.com

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

假设有这么一个场景,你从数据库读取 User 集合,你需要将其转为 Map 结构数据,key 和 value 分别为 user 的 id 和 name。wBC28资讯网——每日最新资讯28at.com

很快,你啪的一下就写出了下面的代码:wBC28资讯网——每日最新资讯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 值重复。wBC28资讯网——每日最新资讯28at.com

wBC28资讯网——每日最新资讯28at.com

作为优秀的八股文选手,你清楚的记得 HashMap 对象 Key 重复是进行替换。你不信邪,断点一打,堆栈一看,硕大的 uniqKeys 摆在了面前,凭借四级 424 分的优秀战绩你顿时菊花一紧,点开一看,谁家好人 map key 还要去重判断啊。wBC28资讯网——每日最新资讯28at.com

图片图片wBC28资讯网——每日最新资讯28at.com

好好好,这么玩是吧,你转身打开浏览器一搜,原来需要自己手动处理重复场景,啪的一下你又重新改了一下代码:wBC28资讯网——每日最新资讯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 又拍在你那笑容渐渐消失的脸上。wBC28资讯网——每日最新资讯28at.com

wBC28资讯网——每日最新资讯28at.com

静下心来,本着什么大风大浪我没见过的心态,断点堆栈一气呵成,而下一秒你又望着代码陷入了沉思,我是谁?我在干什么?wBC28资讯网——每日最新资讯28at.com

图片图片wBC28资讯网——每日最新资讯28at.com

图片图片wBC28资讯网——每日最新资讯28at.com

鼓起勇气,你还不信今天就过不去这个坎了,大手一挥,又一段优雅的代码孕育而生。wBC28资讯网——每日最新资讯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 点了。wBC28资讯网——每日最新资讯28at.com

这时候你回头一看,我需要是什么来着?这 TM 不是一个循环就万事大吉了吗,不信邪的你回归初心,回归了 for 循环的怀抱,又写了一版。wBC28资讯网——每日最新资讯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 不羁的外衣,安心的提交了代码,这口细糠一定也要让好同事去尝一尝。wBC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100191-0.htmlStream很好,Map很酷,但答应我别用toMap()

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 最近很火的Vue Vine是如何实现一个文件中写多个组件

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

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top