對數組和集合進行排序是Java 8 lambda
令人驚奇的一個應用,我們可以實現一個Comparators
來實現各種排序。
看下面案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
static class Person { final String firstName; final String lastName; Person(String firstName, String lastName) { this .firstName = firstName; this .lastName = lastName; } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\ '' + ", lastName='" + lastName + '\ '' + '}' ; } } |
Person的數據有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
List<Person> people = Arrays.asList( new Person( "Jane" , "Henderson" ), new Person( "Michael" , "White" ), new Person( "Henry" , "Brighton" ), new Person( "Hannah" , "Plowman" ), new Person( "William" , "Henderson" ) ); |
我們希望根據名字排序(last name
),然后再根據姓(first name
)排序。
在Java 7之前,我們通常是通過實現一個Comparator:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
people.sort( new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { int result = o1.lastName.compareTo(o2.lastName); if (result == 0 ) result = o1.firstName.compareTo(o2.firstName); return result; } }); people.forEach(System.out::println); |
而在Java 8中,我們可以使用lambda替代匿名函數,如下:
1
2
3
4
5
6
7
8
9
10
11
|
Comparator<Person> c = (p, o) -> p.lastName.compareTo(o.lastName); c = c.thenComparing((p, o) -> p.firstName.compareTo(o.firstName)); people.sort(c); people.forEach(System.out::println); |
在這里,Lambda
表達式 (p, o) -> p.lastName.compareTo(o.lastName)
替代之前的匿名函數new Comparator<Person>() {}
因為Java
編譯器并不能推遲對Lambda
表達式類型判斷,比如延遲到將comparator
傳遞到sort()
方法,因此使得我們進行鏈式Comparator
書寫有點困難,
比如我們想寫成如下:
1
2
|
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName)) .thenComparing((p, o) -> p.firstName.compareTo(o.firstName)) |
換句話說,類型判斷是從左到右,而不是從右到左,我們可以通過創建一個泛型來進行類型推斷:
1
2
3
4
5
6
7
8
9
|
class Utils { static <E> Comparator<E> compare() { return (e1, e2) -> 0 ; } } |
通過上面的compare()方法,我們可以書寫流暢的comparator鏈:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
people.sort( Utils.<Person>compare() .thenComparing((p, o) -> p.lastName.compareTo(o.lastName)) .thenComparing((p, o) -> p.firstName.compareTo(o.firstName)) ); people.forEach(System.out::println); |
到此這篇關于Java8的Lambda和排序的文章就介紹到這了,更多相關Java Lambda和排序內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.jdon.com/idea/java/java-8-lambdas-sorting.html