Comparator
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class TestComparator {
public static void main(String[] args) {
List<Student> students = buildStudents();
// 使用lambda表達(dá)式創(chuàng)建Function對(duì)象
Function<Student, Integer> extractIdWay1 = (student) -> student.getId();
// 使用方法引用簡(jiǎn)化lambda
Function<Student, Integer> extractIdWay2 = Student::getId;
// Comparator.comparing(Function keyExtractor)
Comparator<Student> byId = Comparator.comparing(extractIdWay2);
// 升序
List<Student> ascList = students.stream().sorted(byId).collect(Collectors.toList());
System.out.println(ascList);
// 降序
List<Student> descList = students.stream().sorted(byId.reversed()).collect(Collectors.toList());
System.out.println(descList);
//如果出現(xiàn)多個(gè)對(duì)象的組合封裝需要排序骇扇,可以層層構(gòu)造comparator
Comparator<Address> cmpAddr = Comparator.comparing(Address::getAddress);
Comparator<Student> byAddress = Comparator.comparing(Student::getAddress, cmpAddr);
List<Student> sortedAddressList = students.stream().sorted(byAddress).collect(Collectors.toList());
System.out.println(sortedAddressList);
// 包含null
Comparator<Student> nullNotAllowed = Comparator.comparing(Student::getId);
Comparator<Student> allowNullComparator = Comparator.nullsFirst(nullNotAllowed);
// 正常排序
List<Student> result1 = students.stream().sorted(allowNullComparator).collect(Collectors.toList());
System.out.println(result1);
// 拋異常
List<Student> result2 = students.stream().sorted(nullNotAllowed).collect(Collectors.toList());
System.out.println(result2);
}
private static List<Student> buildStudents() {
List<Student> students = new ArrayList<>();
students.add(new Student(10, 20, "aty", new Address("d")));
students.add(new Student(1, 22, "qun", new Address("c")));
students.add(new Student(1, 26, "Zen", new Address("b")));
students.add(new Student(5, 23, "aty", new Address("a")));
return students;
}
}
Comparable
@Data
public class StudentComparable implements Comparable<StudentComparable> {
private int id;
private Integer age;
private String name;
private Address address;
public StudentComparable(int id, Integer age, String name, Address address) {
this.id = id;
this.age = age;
this.name = name;
this.address = address;
}
@Override
public int compareTo(StudentComparable o) {
return this.getId() - o.getId();
}
}
public class TestComparable {
public static void main(String[] args) {
List<StudentComparable> students = buildStudents();
// 按照默認(rèn)順序排序
List<StudentComparable> ascList1 = students.stream().sorted().collect(Collectors.toList());
System.out.println(ascList1);
// 按照自然序排序(其實(shí)就是默認(rèn)順序)
List<StudentComparable> ascList2 = students.stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
System.out.println(ascList2);
// 按照默認(rèn)順序的相反順序排序
List<StudentComparable> descList = students.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(descList);
}
private static List<StudentComparable> buildStudents() {
List<StudentComparable> students = new ArrayList<>();
students.add(new StudentComparable(10, 20, "aty", new Address("d")));
students.add(new StudentComparable(1, 22, "qun", new Address("c")));
students.add(new StudentComparable(1, 26, "Zen", new Address("b")));
students.add(new StudentComparable(5, 23, "aty", new Address("a")));
return students;
}
}