1. 程式人生 > >JAVA8-用lamda表示式和增強版Comparator進行排序

JAVA8-用lamda表示式和增強版Comparator進行排序

轉自

以前的排序一般物件實現Comparable或者Comparator介面,經常是通過匿名類類實現。 可以參見以前的博文 Java 中 Comparable 和 Comparator 比較 現在看看使用lamda表示式和java8中增強的Comparator介面進行排序。

先定義一個簡單的實體類:

class Human {
    private String name;
    private int age;

    public Human() {
        super();
    }

    public Human(final String name, final int
age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this
.age = age; } }

1. 使用lamda表示式或方法引用進行排序

lamda表示式

List<Human> humans = new ArrayList<>();
humans.add(new Human("Sarah", 10));
humans.add(new Human("Jack", 12));

humans.sort((Human h1, Human h2) -> h1.getName().compareTo(h2.getName()));
//humans.sort((h1, h2) -> h1.getName().compareTo(h2.getName()));//簡化

當然lamda表示式也可以使用靜態方法的引用代替。

public static int compareByNameThenAge(Human lhs, Human rhs) {
    if (lhs.name.equals(rhs.name)) {
        return lhs.age - rhs.age;
    } else {
        return lhs.name.compareTo(rhs.name);
    }
}

List<Human> humans = new ArrayList<>();
humans.add(new Human("Sarah", 10));
humans.add(new Human("Jack", 12));

humans.sort(Human::compareByNameThenAge);

2. 使用增強版的Comparator介面

List<Human> humans = new ArrayList<>();
humans.add(new Human("Sarah", 10));
humans.add(new Human("Jack", 12));

Collections.sort(humans, Comparator.comparing(Human::getName));

還可以使用反轉

Collections.sort(humans, Comparator.comparing(Human::getName).reversed());

3. 多條件排序

3.1 使用lamda表示式

List<Human> humans = new ArrayList<>();
humans.add(new Human("Sarah", 10));
humans.add(new Human("Jack", 12));
humans.add(new Human("Jack", 10));

humans.sort((lhs, rhs) -> {
            if (lhs.getName().equals(rhs.getName())) {
                return Integer.compare(lhs.getAge(), rhs.getAge());
            } else {
                return lhs.getName().compareTo(rhs.getName());
            }
        });

3.2使用Comparator進行組合

List<Human> humans = new ArrayList<>();
humans.add(new Human("Sarah", 10));
humans.add(new Human("Jack", 12));
humans.add(new Human("Jack", 10));

humans.sort(Comparator.comparing(Human::getName).thenComparing(Human::getAge));