【摘要】最近公司在大力提倡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())