• #华为云·寻找黑马程序员#【代码重构之路】我是如何将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())

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

  • 相关阅读:
    Spring Boot 2.x实战之StateMachine
    Spring Boot实战之定制type Formatters
    Spring Boot实战之定制URL匹配规则
    Spring Boot项目中如何定制servlet-filters
    Mac高效开发之iTerm2、Prezto和Solarized主题
    Spring Boot应用的健康监控
    Spring Boot构建的Web项目如何在服务端校验表单输入
    Spring Boot项目中如何定制PropertyEditors
    Spring Boot项目中如何定制拦截器
    在Spring Boot项目中使用Spock测试框架
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165674.html
Copyright © 2020-2023  润新知