對(duì)數(shù)組和集合進(jìn)行排序是Java 8 lambda
令人驚奇的一個(gè)應(yīng)用,我們可以實(shí)現(xiàn)一個(gè)Comparators
來(lái)實(shí)現(xiàn)各種排序。
看下面案例:
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的數(shù)據(jù)有:
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" ) ); |
我們希望根據(jù)名字排序(last name
),然后再根據(jù)姓(first name
)排序。
在Java 7之前,我們通常是通過實(shí)現(xiàn)一個(gè)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替代匿名函數(shù),如下:
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
表達(dá)式 (p, o) -> p.lastName.compareTo(o.lastName)
替代之前的匿名函數(shù)new Comparator<Person>() {}
因?yàn)?code>Java編譯器并不能推遲對(duì)Lambda
表達(dá)式類型判斷,比如延遲到將comparator
傳遞到sort()
方法,因此使得我們進(jìn)行鏈?zhǔn)?code>Comparator書寫有點(diǎn)困難,
比如我們想寫成如下:
1
2
|
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName)) .thenComparing((p, o) -> p.firstName.compareTo(o.firstName)) |
換句話說,類型判斷是從左到右,而不是從右到左,我們可以通過創(chuàng)建一個(gè)泛型來(lái)進(jìn)行類型推斷:
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); |
到此這篇關(guān)于Java8的Lambda和排序的文章就介紹到這了,更多相關(guān)Java Lambda和排序內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.jdon.com/idea/java/java-8-lambdas-sorting.html