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

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

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

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

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

//1、通过实现Comparable接口来排序
public class Student implements Comparable<Student> {    
    private int age;    
    //省略get set方法
    @Override
    public 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>() {    
    @Override
    public 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())

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

原文地址:https://www.cnblogs.com/huaweicloud/p/11861651.html