【摘要】最近公司在大力提倡clean code, 而clean code 不仅是新写的代码要做,老旧的代码也要适当重构,精简我们的代码,毕竟代码还是要给人看的。

个人比较喜欢重构,当然,手术级的重构没做过,但是小小补补还是可以的。在浏览代码时,看到项目中有不少可以改进的地方,于是就选择性地做了一些简单的重构

下图是我的一个重构提交记录,也是本次分享的主题。成功的将8行代码精简为1行

这2段demo,是很经典的对象排序,相信你也经常见过

//1、通过实现Comparable接口来排序
public class Student implements Comparable<Student> {    private int age;    //省略get set方法@Overridepublic int compareTo(Student o) {        if (this.getAge() > o.getAge()) {            return 1;} else if (this.getAge() < o.getAge()) {            return -1;} else {            return 0;}}
}    //排序List<Student> students = ...Collections.sort(students);
//2、使用匿名内部类
List<Student> students = ...
Collections.sort(students, new Comparator<Student>() {    @Overridepublic int compare(Student o1, Student o2) {        return o1.getAge() - o2.getAge();}
});

这段代码的意图很简单,就是将集合中的Student根据age属性进行升序排序。很简单的逻辑,却用了这么多行,其实Java最为人诟病的地方就是语法繁琐,明明是很简单的需求,非要很多行才能搞定,但是Java也在不断进步呀。这不,上面的代码,就可以用一行代码搞定。
现在我就来重构段代码,在此之前,你需要了解Java8的知识,本篇博客不提供教程,如有需要,请移步Java8教程

Java8于2014年发布,是Java历史上很重要的一个版本,它正式支持了函数式编程
截至目前,Java最新版本为Java12。
要注意项目中使用的JDK版本,比如项目中是JDK8,重构时你用了Var,修改引入问题,真是该杀。

第一步:使用lambda表达式替换匿名内部类

Collections.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

第二步:List.sort替换Collections

students.sort((o1, o2) -> o1.getAge() - o2.getAge());

第三步:lambda表达式改为方法引用

students.sort(Comparator.comparingInt(Student::getAge));

ok,上面代码通通不要,只此一行代码搞定! 默认是升序。
那么问题来了,如果我要降序怎么办,别急,可以翻转啊啊啊啊

students.sort(Comparator.comparingInt(Student::getAge).reversed());

这里用到了Comparator.comparingInt()方法,用于比较Int型,我们看下它的所有方法

除了Int,还有其他类型的比较,并且thenComparing方法提供了二次比较的能力,比如还有一个属性name,当age相同时,就比较name属性来排序。

代码可读性很重要,最后让我们从左往右读下这段代码:
“将students按照age排升序,最后给我翻转下吧。” 就是这么简单~

students.sort(Comparator.comparingInt(Student::getAge).reversed())

来源:华为云社区  作者:大刁哥

#华为云·寻找黑马程序员#【代码重构之路】我是如何将8行代码缩减成1行的相关推荐

  1. 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#

    [摘要] #华为云.寻找黑马程序员# 不管是最早的Phonegap,还是后来的React Native.Weex,Flutter,或者是各个公司自创开发语言,都是在不断寻求开发语言统一,从而解决ios ...

  2. 三伏天里小试牛刀andriod开发 #华为云·寻找黑马程序员#

    三伏天里小试牛刀andriod 开发 #华为云·寻找黑马程序员# 2019年07月,北京,三伏天,好热啊.越热自己还越懒得动换(肉身给的信号),但是做为产品经理/交互设计师的,总想着思考些什么(灵魂上 ...

  3. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  4. #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  5. eplices如何导入外部代码_#华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源...

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  6. #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势

    1.问题 在浏览项目时,发现一段使用正则表达式的代码 这段代码,在循环里执行了Pattern.matches()方法进行正则匹配判断. 查看matches方法的源码,可以看到 每调用一次matches ...

  7. python让你再也不为文章配图与素材发愁,让高清图片占满你的硬盘! #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. 大型情感剧集Selenium:1_介绍 #华为云·寻找黑马程序员#

    学习selenium能做什么? 很多书籍.文章中是这么定义selenium的: Selenium 是开源的自动化测试工具,它主要是用于Web 应用程序的自动化测试,不只局限于此,同时支持所有基于web ...

  9. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)#华为云·寻找黑马程序员#

    [摘要] three.js实现的Web 3D字体模型动画 示例代码托管在:http://www.github.com/dashnowords/blogs 有了上一篇基础知识的储备,本节就来制作一下简易 ...

最新文章

  1. 修复思维导图mindmanager移动文件位置后打开崩溃
  2. python(numpy,pandas1)——numpy(ndim,shape,size,zero, empty, arange, linspace)
  3. Linux下Apache自动监测重启脚本
  4. 腾讯机器狗,站起来了!
  5. javaScript转换日期合格式
  6. python元素分类_Python 练习 - 元素分类
  7. XGBoost实战与调参优化
  8. SVN图标不能正常显示
  9. 开课吧:一文读懂算法工程师大致分类与技术要求
  10. Windows核心编程_更改当前工作目录
  11. html倾斜变形,深入理解CSS变形transform(2d)_html/css_WEB-ITnose
  12. 关于三极管的饱和与截止(失真)
  13. ATK-SIM900A入门
  14. uniapp H5微信公众号跳转小程序
  15. cross product or vector product - 叉积或向量积
  16. EDI 公开课:X12 850采购订单转换至可视化Excel
  17. python将html转成pdf,python将html转成PDF的示例
  18. vs编译运行报错:未声明的标识符
  19. QT Creator 输入中文变繁体的解决方法
  20. MCK主机加固数据安全解决方案

热门文章

  1. 计算机科学与技术考英语一还是英语二,​在职研究生考试是考英语一还是英语二?区别是什么?...
  2. 套用表格格式转化为普通区域_学会修改表格格式,让你的报表更美观
  3. centos mysql cpu_MySQL占用CPU100%解决一例
  4. vc6 设置静态文本框透明_微信还能这么玩?半透明的微信背景主题用起来!
  5. linux下python开发工具_Python开发工具 Wing IDE
  6. php 单引号 数据库,关于php:如何在写入Mysql数据库时处理撇号’单引号
  7. 【错误】【vscode】'#' not expected here
  8. jQuery UI加入效果
  9. Oracle11g数据库监听配置
  10. leetcode 1189 python