不要再写这样的神级代码了!
关注公众号(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完整版。
不要再写这样的神级代码了!相关推荐
- 神级代码编辑软件(Sublime Text 3) v3.3114 汉化特别版
2019独角兽企业重金招聘Python工程师标准>>> Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选 ...
- 【简约而不简单:神级代码的小秘密】| 第二章 栈
2.1 什么是栈 有一种艺术叫做沙画.把沙子一层一层的叠在一起,从而形成美丽的图案.从图中可以看到,最底层的深蓝色沙子是最先放进去的. 继续放沙子,我们可以看到,最先放入的蓝色沙子在底部,而最后放入的 ...
- AutoJs超神级代码分享大更新
源代码下载链接:百度网盘 请输入提取码 提取码:d2zb 奋斗了120多个日夜终于算有点小成果,到今天所有的实战内容就都完事了.这个是我最后一次和大家分享代码.薅羊毛本身不违法就这个事情本身也不算在 ...
- 【转】神级代码注释 优秀的comment
转自github 写在前面的话:一时兴起就收集了以下神注释,希望能为广大ITer带来快乐,缓解你们工作中的压力,下面开车,先自爆头像,下文会给出制作链接. /*** * 瓦瓦 十 * 十齱龠己 亅瓦車 ...
- 最后一次AutoJs超神级代码分享
源代码下载链接:https://pan.baidu.com/s/16Ar8RLG9WPN8SMlfGsLwjQ 提取码:hjeo 奋斗了120多个日夜终于算有点小成果,到今天所有的实战内容就都完事了. ...
- 【PC工具】大神级代码注释,漂亮实用的代码注释工具代码logo工具
github上看各路大牛大神的项目代码,经常会看到各种神注释 ...... 那么问题就来了:大神是如何在代码里搞的这些图片代码呢? 打死我也不信是大牛大神一个一个打上去,这不是大牛大神的风格 . 今天 ...
- 前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键...
Sublime Text 是一个代码编辑器,也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能 ...
- 前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键
Sublime Text 是一个代码编辑器,也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能 ...
- 神级代码编辑器 Sublime Text 全程指南
转载来自[http://mdsa.51cto.com/art/201507/484183_all.htm#topx] 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最 ...
最新文章
- NMSE考试常见问题
- linux 权限 775 777 区别
- ios开发证书,描述文件,bundle ID的关系
- LeetCode7.反转整数
- Shell脚本学习-阶段三
- GetModuleFileNameA函数与GetCurrentDirectoryA函数
- 轻松搭建docker应用的mesos集群
- Linux调试工具之readelf
- Python编程实践之Choose
- 计算机控制系统的典型类型是什么,计算机控制系统作业参考答案
- .NET Conf China 2022 第一批讲师阵容大揭秘!整个期待了!
- Xcode中使用自定义字体
- git ssh 登陆失败: no matching host key type found. Their offer: ssh-dss 解决办法
- 神啊,请让我丑一点吧
- windows7系统无法开机显示丢失volmgrx.sys驱动文件
- linux俄罗斯方块源程序,C++实现俄罗斯方块(linux版本).pdf
- 北航软件学院课程 实用软件工具 03: Microsoft Office
- mysql提供的凭证是什么_记账凭证是什么
- DataRow转实体
- 皇家贝贝《秦俑情》开机 杜淳安以轩“接棒”张艺谋巩俐
热门文章
- 微信公众平台PHP开发
- Google News优化技巧
- codeigniter view 试图里再引入view视图
- 从Linux服务器端下载文件Win客户端
- C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()
- 【三维深度学习】点云上采样网络PU-Net
- 【今日CS 视觉论文速览】 18 Dec 2018
- SpringBoot——Quartz定时框架的使用详解和总结
- 目录浏览控件fbd c# 1614612744
- 仓库对象DataSet与小车对象DataAdapter的 关键命令 1201