不要再写这样的神级代码了!

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

不要再写这样的神级代码了!

OKevin   2020-03-21 我要评论
JDK8提供的Stream虽然好用,Lambda虽然简洁,但一定不能**滥用**,我举一个实际遇到的例子(已做脱敏处理): ```java Map> 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)); ``` 试问谁能看得懂?难道是没有换行格式化? ```java Map> 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这样的神奇帮助我们,鼠标移动到代码处,点击右键出现以下菜单: ![](https://img2020.cnblogs.com/blog/630246/202003/630246-20200321213329871-1317185663.jpg) 点击“Show Context Actions”,出现以下内容: ![](https://img2020.cnblogs.com/blog/630246/202003/630246-20200321213340369-187524759.png) 选择“Replace Stream API chain with loop(利用循环代替Stream流操作)”。 当我把所有的Stream流操作以及简写的lambda表达式用“传统”代码取代后,代码逻辑如下: ```java Map> map = new HashMap<>(); //按step进行分组 for (Student student : students) { //computeIfAbsent方法等同下列代码 /*List list = map.get(student.getStudentNumber()); if (list == null) { list = new ArrayList<>(); map.put(list); } list.add(student)*/ map.computeIfAbsent(student.getStudentNumber(), new Function>() { @Override public List apply(Long k) { return new ArrayList<>(); } }).add(student); } //把Map的Entry元素放入List中,并排序 List>> toSort = new ArrayList<>(); for (Map.Entry> integerListEntry : map .entrySet()) { toSort.add(integerListEntry); } toSort.sort(Map.Entry.comparingByKey()); //再使用LinkedHashMap按插入顺序排列 Map> studentkMap = new LinkedHashMap<>(); for (Map.Entry> integerListEntry : toSort) { studentkMap.putIfAbsent(integerListEntry.getKey(), integerListEntry.getValue()); } ``` 这样看代码逻辑清晰了,实际上不就是把List按元素中的step分组,并按字典序排列么?如果按照开始的Stream+Lambda表达式,别说优化,连看懂都是问题。当我们把代码改为“传统”代码后,逻辑一下就清晰了。 ```java Map>> studentMap = new TreeMap<>(); for (Student student : students) { List 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)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们