一、排序方法
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-tw/n/248634.html
微信掃一掃
支付寶掃一掃