关注公众号(CoderBuff)回复“stream”获取《Java8 Stream编码实战》PDF完整版。

JDK8提供的Stream虽然好用,Lambda虽然简洁,但一定不能滥用,我举一个实际遇到的例子(已做脱敏处理):

Map<Long, List<Student>> studentMap = students.stream().collect(Collectors.groupingBy(Student::getStudentNumber)).entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));

试问谁能看得懂?难道是没有换行格式化?

Map<Long, List<Student>> studentMap = students.stream().collect(Collectors.groupingBy(Student::getStudentNumber))      //这里是要把students按studentNumber分组.entrySet().stream().sorted(Map.Entry.comparingByKey())     //分组后再把把key值拿来排序组成新的Stream流.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,       //然后再组成Map?不好意思实在是读不下去了(oldValue, newValue) -> oldValue, LinkedHashMap::new));

换行格式化后,前面的流操作还能勉强读懂,遇到最后的lambda表达式实在没办法读下去了,根本不知道他想表达什么意思。

但是,如果我们真正遇到这样的“大神级”代码怎么办?还好有IDEA这样的神奇帮助我们,鼠标移动到代码处,点击右键出现以下菜单:

点击“Show Context Actions”,出现以下内容:

选择“Replace Stream API chain with loop(利用循环代替Stream流操作)”。

当我把所有的Stream流操作以及简写的lambda表达式用“传统”代码取代后,代码逻辑如下:

Map<Long, List<Student>> map = new HashMap<>();
//按step进行分组
for (Student student : students) {//computeIfAbsent方法等同下列代码/*List<Student> list = map.get(student.getStudentNumber());if (list == null) {list = new ArrayList<>();map.put(list);}list.add(student)*/map.computeIfAbsent(student.getStudentNumber(), new Function<Long, List<Student>>() {@Overridepublic List<Student> apply(Long k) {return new ArrayList<>();}}).add(student);
}
//把Map的Entry元素放入List中,并排序
List<Map.Entry<Long, List<Student>>> toSort = new ArrayList<>();
for (Map.Entry<Long, List<Student>> integerListEntry : map.entrySet()) {toSort.add(integerListEntry);
}
toSort.sort(Map.Entry.comparingByKey());
//再使用LinkedHashMap按插入顺序排列
Map<Long, List<Student>> studentkMap = new LinkedHashMap<>();
for (Map.Entry<Long, List<Student>> integerListEntry : toSort) {studentkMap.putIfAbsent(integerListEntry.getKey(), integerListEntry.getValue());
}

这样看代码逻辑清晰了,实际上不就是把List按元素中的step分组,并按字典序排列么?如果按照开始的Stream+Lambda表达式,别说优化,连看懂都是问题。当我们把代码改为“传统”代码后,逻辑一下就清晰了。

Map<Long, List<Student>>> studentMap = new TreeMap<>();
for (Student student : students) {List<Student> list = map.get(student.getStudentNumber());if (list == null) {list = new ArrayList<>();map.put(list);}list.add(student)
}

适当是使用Stream和Lambda这样是不是更好呢?

关注公众号(CoderBuff)回复“stream”获取《Java8 Stream编码实战》PDF完整版。

这是一个能给程序员加buff的公众号 (CoderBuff)

不要再写这样的神级代码了!相关推荐

  1. 神级代码编辑软件(Sublime Text 3) v3.3114 汉化特别版

    2019独角兽企业重金招聘Python工程师标准>>> Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选 ...

  2. 【简约而不简单:神级代码的小秘密】| 第二章 栈

    2.1 什么是栈 有一种艺术叫做沙画.把沙子一层一层的叠在一起,从而形成美丽的图案.从图中可以看到,最底层的深蓝色沙子是最先放进去的. 继续放沙子,我们可以看到,最先放入的蓝色沙子在底部,而最后放入的 ...

  3. AutoJs超神级代码分享大更新

    源代码下载链接:百度网盘 请输入提取码  提取码:d2zb 奋斗了120多个日夜终于算有点小成果,到今天所有的实战内容就都完事了.这个是我最后一次和大家分享代码.薅羊毛本身不违法就这个事情本身也不算在 ...

  4. 【转】神级代码注释 优秀的comment

    转自github 写在前面的话:一时兴起就收集了以下神注释,希望能为广大ITer带来快乐,缓解你们工作中的压力,下面开车,先自爆头像,下文会给出制作链接. /*** * 瓦瓦 十 * 十齱龠己 亅瓦車 ...

  5. 最后一次AutoJs超神级代码分享

    源代码下载链接:https://pan.baidu.com/s/16Ar8RLG9WPN8SMlfGsLwjQ 提取码:hjeo 奋斗了120多个日夜终于算有点小成果,到今天所有的实战内容就都完事了. ...

  6. 【PC工具】大神级代码注释,漂亮实用的代码注释工具代码logo工具

    github上看各路大牛大神的项目代码,经常会看到各种神注释 ...... 那么问题就来了:大神是如何在代码里搞的这些图片代码呢? 打死我也不信是大牛大神一个一个打上去,这不是大牛大神的风格 . 今天 ...

  7. 前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键...

    Sublime Text 是一个代码编辑器,也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能 ...

  8. 前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键

    Sublime Text 是一个代码编辑器,也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能 ...

  9. 神级代码编辑器 Sublime Text 全程指南

    转载来自[http://mdsa.51cto.com/art/201507/484183_all.htm#topx] 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最 ...

最新文章

  1. NMSE考试常见问题
  2. linux 权限 775 777 区别
  3. ios开发证书,描述文件,bundle ID的关系
  4. LeetCode7.反转整数
  5. Shell脚本学习-阶段三
  6. GetModuleFileNameA函数与GetCurrentDirectoryA函数
  7. 轻松搭建docker应用的mesos集群
  8. Linux调试工具之readelf
  9. Python编程实践之Choose
  10. 计算机控制系统的典型类型是什么,计算机控制系统作业参考答案
  11. .NET Conf China 2022 第一批讲师阵容大揭秘!整个期待了!
  12. Xcode中使用自定义字体
  13. git ssh 登陆失败: no matching host key type found. Their offer: ssh-dss 解决办法
  14. 神啊,请让我丑一点吧
  15. windows7系统无法开机显示丢失volmgrx.sys驱动文件
  16. linux俄罗斯方块源程序,C++实现俄罗斯方块(linux版本).pdf
  17. 北航软件学院课程 实用软件工具 03: Microsoft Office
  18. mysql提供的凭证是什么_记账凭证是什么
  19. DataRow转实体
  20. 皇家贝贝《秦俑情》开机 杜淳安以轩“接棒”张艺谋巩俐

热门文章

  1. 微信公众平台PHP开发
  2. Google News优化技巧
  3. codeigniter view 试图里再引入view视图
  4. 从Linux服务器端下载文件Win客户端
  5. C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()
  6. 【三维深度学习】点云上采样网络PU-Net
  7. 【今日CS 视觉论文速览】 18 Dec 2018
  8. SpringBoot——Quartz定时框架的使用详解和总结
  9. 目录浏览控件fbd c# 1614612744
  10. 仓库对象DataSet与小车对象DataAdapter的 关键命令 1201