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

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

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

下图是我的一个重构提交记录,也是本次分享的主题。成功的将8行代码精简为1行
result
这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());
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值