Java8的Lambda和排序
對數(shù)組和集合進(jìn)行排序是Java 8 lambda
令人驚奇的一個應(yīng)用,我們可以實(shí)現(xiàn)一個Comparators
來實(shí)現(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之前,我們通常是通過實(shí)現(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
表達(dá)式 (p, o) -> p.lastName.compareTo(o.lastName)
替代之前的匿名函數(shù)new Comparator<Person>() {}
因?yàn)?code>Java編譯器并不能推遲對Lambda
表達(dá)式類型判斷,比如延遲到將comparator
傳遞到sort()
方法,因此使得我們進(jìn)行鏈?zhǔn)?code>Comparator書寫有點(diǎn)困難,
比如我們想寫成如下:
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName)) .thenComparing((p, o) -> p.firstName.compareTo(o.firstName))
換句話說,類型判斷是從左到右,而不是從右到左,我們可以通過創(chuàng)建一個泛型來進(jìn)行類型推斷:
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);
到此這篇關(guān)于Java8的Lambda和排序的文章就介紹到這了,更多相關(guān)Java Lambda和排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- 吊打Java面試官之Lambda表達(dá)式 Stream API
- Java8中Lambda表達(dá)式使用和Stream API詳解
- Java使用lambda自定義Arrays.sort排序規(guī)則說明
- Java 進(jìn)階使用 Lambda 表達(dá)式實(shí)現(xiàn)超強(qiáng)的排序功能
- lambda表達(dá)式解決java后臺分組排序過程解析
- Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)
- Java中的lambda和stream實(shí)現(xiàn)排序
相關(guān)文章
Struts2.5版本struts.xml與web.xml配置的更改方法
這篇文章主要給大家介紹了關(guān)于Struts2.5版本中struts.xm與web.xml配置的更改方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Java可以如何實(shí)現(xiàn)文件變動的監(jiān)聽的示例
本篇文章主要介紹了Java可以如何實(shí)現(xiàn)文件變動的監(jiān)聽的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02舉例講解Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例,模板方法模式強(qiáng)調(diào)基于繼承的代碼復(fù)用,需要的朋友可以參考下2016-05-05詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出
這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下2022-07-07Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩過的坑
IDEA旗艦版可以直接創(chuàng)建Spring MVC項(xiàng)目,但創(chuàng)建后的項(xiàng)目并不是直接就可以運(yùn)行,還需要進(jìn)行一些配置。這篇文章主要介紹了Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩坑記 ,需要的朋友可以參考下2020-03-03