再谈Comparator-使用lambda表达式

关于Comparable和Comparator 的区别以及作用:
1. Java 中 Comparable 和 Comparator 比较 - 如果天空不死 - 博客园
2. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法) - Luc - 博客园

正文

先写一个Person类,主要有address跟name两个成员属性以及他们的getter()方法,最后补刀重写toString()方法

public class Person {
    private String address;
    private String name;

    public Person(String firstName, String lastName) {
        this.address = firstName;
        this.name = lastName;
    }

    public String getAddress() {
        return address;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return getClass().getSimpleName()+"{" +
                "address='" + address + '\'' +
                ", name='" + name + '\'' +
                '}';
    }


}

以前

  • 以前写比较排序的时候,总需要写一大堆代码,比如下面:
public class TestCh06 {
    public static void main(String... args) throws CloneNotSupportedException {

        //定义一个Person类数组
        Person[] arr = {new Person("wo", "2722"), new Person("uj", "2829"), new Person("dh", "272"),
                new Person("us", "1"), new Person("jaka", "881711")};
        LenComparator lc = new LenComparator();
        //排序
        Arrays.sort(arr, lc);

        System.out.println(Arrays.toString(arr));

    }

}

/**
 * 按照名字长度来排序的比较器-->主要用于String类型的数组
 */
class LenComparator implements Comparator {

    @Override
    public int compare(Person o1, Person o2) {
        return Integer.compare(o1.getName().length(), o2.getName().length());
    }

}

现在

  • 如今Java8SE出来了很久了,如果还使用上面的代码写作确实有点缺优雅,因为Comparator接口包含了很多方便的静态方法类创建比较器(这些方法可以用于lambda表达式或者方法引用)
        //按照名字进行排序
        Arrays.sort(arr, Comparator.comparing(Person::getName));

        //按照名字长度进行排序
        Arrays.sort(arr,Comparator.comparing(Person::getName,(s,t)->Integer.compare(s.length(),t.length())));
        Arrays.sort(arr,Comparator.comparingInt(p->p.getName().length()));

        //先按照名字进行排序,如果名字相同,再按照地址比较
        Arrays.sort(arr,Comparator.comparing(Person::getName).thenComparing(Person::getAddress));
温馨提示:其实在平常用的比较也不多,只是在需要的时候才用到,更希望大家可以掌握一些lambda表达式更好


————-我是低调的分割线————————–

如果对你有帮助,可以点击“推荐”哦`(*∩_∩*)′

PS:可爱的动画感谢博客园的萌小Q博主,其实还是蛮希望跟她成为好友的,她做的博客内容写的很好

你可能感兴趣的:(JavaSE学习笔记)