Java8的Lambda和排序
對(duì)數(shù)組和集合進(jìn)行排序是Java 8 lambda令人驚奇的一個(gè)應(yīng)用,我們可以實(shí)現(xiàn)一個(gè)Comparators來(lái)實(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之前,我們通常是通過(guò)實(shí)現(xiàn)一個(gè)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編譯器并不能推遲對(duì)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))
換句話說(shuō),類型判斷是從左到右,而不是從右到左,我們可以通過(guò)創(chuàng)建一個(gè)泛型來(lái)進(jìn)行類型推斷:
class Utils {
static <E> Comparator<E> compare() {
return (e1, e2) -> 0;
}
}
通過(guò)上面的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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- 吊打Java面試官之Lambda表達(dá)式 Stream API
- Java8中Lambda表達(dá)式使用和Stream API詳解
- Java使用lambda自定義Arrays.sort排序規(guī)則說(shuō)明
- Java 進(jìn)階使用 Lambda 表達(dá)式實(shí)現(xiàn)超強(qiáng)的排序功能
- lambda表達(dá)式解決java后臺(tái)分組排序過(guò)程解析
- 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配置的更改方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽(tīng)的示例
本篇文章主要介紹了Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽(tīng)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
舉例講解Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例,模板方法模式強(qiáng)調(diào)基于繼承的代碼復(fù)用,需要的朋友可以參考下2016-05-05
Java8中字符串處理庫(kù)strman-java的使用示例
除了Java本身的字符串處理方式外,我們還可以使用Apache Common Langs里的StringUtils來(lái)簡(jiǎn)化String的操作。但以上兩種方式對(duì)于我們?nèi)粘>幊讨凶钊菀着龅降淖址幚韥?lái)說(shuō),仍然顯得有些不足。所以這篇文章給大家介紹Java8中字符串處理庫(kù)strman-java的使用。2016-09-09
詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出
這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下2022-07-07
springboot?事件監(jiān)聽(tīng)器的案例詳解
這篇文章主要介紹了springboot?事件監(jiān)聽(tīng)器,springboot(spring)的事件監(jiān)聽(tīng)器使用主要有兩種方式,通過(guò)實(shí)現(xiàn)ApplicationListener接口,另一個(gè)就是在類上添加 @EventListener 注解來(lái)實(shí)現(xiàn),接下來(lái)將對(duì)這兩種方式逐一說(shuō)明,需要的朋友可以參考下2022-06-06
Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩過(guò)的坑
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

