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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
Top