JAVA8-用lamda表示式和增強版Comparator進行排序
阿新 • • 發佈:2018-12-15
以前的排序一般物件實現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));