Java8的Lambda和排序
對數(shù)組和集合進行排序是Java 8 lambda
令人驚奇的一個應用,我們可以實現(xiàn)一個Comparators
來實現(xiàn)各種排序。
看下面案例:
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ù)有:
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之前,我們通常是通過實現(xiàn)一個Comparator:
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ù),如下:
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)
替代之前的匿名函數(shù)new Comparator<Person>() {}
因為Java
編譯器并不能推遲對Lambda
表達式類型判斷,比如延遲到將comparator
傳遞到sort()
方法,因此使得我們進行鏈式Comparator
書寫有點困難,
比如我們想寫成如下:
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName)) .thenComparing((p, o) -> p.firstName.compareTo(o.firstName))
換句話說,類型判斷是從左到右,而不是從右到左,我們可以通過創(chuàng)建一個泛型來進行類型推斷:
class Utils { static <E> Comparator<E> compare() { return (e1, e2) -> 0; } }
通過上面的compare()方法,我們可以書寫流暢的comparator鏈:
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和排序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Struts2.5版本struts.xml與web.xml配置的更改方法
這篇文章主要給大家介紹了關于Struts2.5版本中struts.xm與web.xml配置的更改方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11Java可以如何實現(xiàn)文件變動的監(jiān)聽的示例
本篇文章主要介紹了Java可以如何實現(xiàn)文件變動的監(jiān)聽的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項目踩過的坑
IDEA旗艦版可以直接創(chuàng)建Spring MVC項目,但創(chuàng)建后的項目并不是直接就可以運行,還需要進行一些配置。這篇文章主要介紹了Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項目踩坑記 ,需要的朋友可以參考下2020-03-03