一、排序方法
Java 8 Stream提供了sorted()方法用於排序,該方法可以配合lambda表達式實現比較器Comparator的功能。在Java 8之前,需要實現Comparator接口的compare()方法才能進行排序,而現在可以使用lambda表達式極大地簡化了代碼。下面是一個簡單的例子:
List list = Arrays.asList(5, 3, 1, 4, 2); list.stream() .sorted((a, b) -> a.compareTo(b)) .forEach(System.out::println);
上述代碼使用了lambda表達式進行比較,輸出結果為:1, 2, 3, 4, 5。
二、方法鏈排序
Java 8 Stream提供了多個方法可以進行鏈式排序,如sorted()、distinct()、limit()和skip()等,下面是一個排序和去重的例子:
List list = Arrays.asList(5, 3, 1, 4, 2, 3); list.stream() .sorted() .distinct() .forEach(System.out::println);
輸出結果為:1, 2, 3, 4, 5。使用方法鏈可以將多個操作組合在一起,代碼可讀性更好。
三、對象排序
Java 8 Stream可以對對象進行排序,需要實現Comparable接口或者自定義比較器Comparator,並將其作為sorted()方法的參數傳遞進去。下面是一個對象排序的例子:
class Student implements Comparable<Student> { private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Student other) { return Integer.compare(this.getId(), other.getId()); } } List<Student> list = Arrays.asList( new Student(2, "Tom", 20), new Student(1, "Jack", 22), new Student(3, "Peter", 18) ); list.stream() .sorted() .forEach(s -> System.out.println(s.getName()));
上述代碼中,Student類實現了Comparable接口,並且重寫了compareTo()方法實現按照id排序。輸出結果為:Jack, Tom, Peter。
四、反向排序
Java 8 Stream提供了方法reversed()用於對排序方式進行反向排序,下面是一個反向排序的例子:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2); list.stream() .sorted(Comparator.reverseOrder()) .forEach(System.out::println);
輸出結果為:5, 4, 3, 2, 1。
五、多條件排序
Java 8 Stream可以使用多個比較器進行排序操作,下面是一個按照年齡和姓名進行排序的例子:
List<Student> list = Arrays.asList( new Student(1, "Tom", 20), new Student(2, "Jack", 22), new Student(3, "Peter", 18), new Student(4, "Tom", 25), new Student(5, "Jack", 18) ); list.stream() .sorted(Comparator.comparing(Student::getAge) .thenComparing(Student::getName)) .forEach(s -> System.out.println(s.getName() + ": " + s.getAge()));
上述代碼中,排序使用了比較器Comparator.comparing()和thenComparing()方法,輸出結果為:Jack: 18, Peter: 18, Tom: 20, Jack: 22, Tom: 25。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/248634.html