Java 8 Lambda 表達(dá)式比較器使用示例代碼
引言
在這個例子中,我們將向您展示如何使用 java8 lambda 表達(dá)式編寫一個 Comparator 來對 List 進(jìn)行排序。
經(jīng)典的比較器示例:
Comparator<Developer> byName = new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } };
使用 lambda:
Comparator<Developer> byName = (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1.沒有 Lambda 的排序
先新建一個 Developer 類,然后比較 Developer 對象的年齡,通常我們使用 Collections.sort
并傳遞匿名 Comparator 類,如下所示:
package com.jimzhang.lambda; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * 〈一句話功能簡述〉<br> 〈排序〉 * * @author zhangjinmiao * @create 2019/8/4 10:19 */ public class TestSorting { public static void main(String[] args) { List<Developer> listDevs = getDevelopers(); System.out.println("Before Sort"); for (Developer developer : listDevs) { System.out.println(developer.toString()); } //sort by age Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); System.out.println("After Sort"); for (Developer developer : listDevs) { System.out.println(developer); } } public static List<Developer> getDevelopers() { List<Developer> developers = new ArrayList<>(); developers.add(new Developer("lisi", new BigDecimal("8000"),23)); developers.add(new Developer("wangwu", new BigDecimal("9000"),24)); developers.add(new Developer("maliu", new BigDecimal("10000"),25)); developers.add(new Developer("zhangsan", new BigDecimal("7000"),22)); return developers; } }
當(dāng)排序要求改變時,您只需傳入另一個新的匿名 Comparator 類:
//sort by age Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); //sort by name Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } }); //sort by salary Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getSalary().compareTo(o2.getSalary()); } });
這是可行的,但是,您是否覺得僅僅因為想要更改一行代碼就創(chuàng)建一個類有點(diǎn)奇怪?
2.使用 Lambda 排序
在 Java 8 中,List 接口直接支持排序方法,不再需要使用 Collections.sort。
//List.sort() since Java 8 listDevs.sort(new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o2.getAge() - o1.getAge(); } });
3.更多例子
1. 按年齡排序
//sort by age Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getAge() - o2.getAge(); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge()); //lambda, valid, parameter type is optional listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());
2. 按名字排序
//sort by name Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName())); //lambda listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));
3. 按薪水排序
//sort by salary Collections.sort(listDevs, new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getSalary().compareTo(o2.getSalary()); } }); //lambda listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary())); //lambda listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()));
4. 反向排序
薪水正序排序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);
輸出:
Developer{name='zhangsan', salary=7000, age=22} Developer{name='lisi', salary=8000, age=23} Developer{name='wangwu', salary=9000, age=24} Developer{name='maliu', salary=10000, age=25}
2.反向排序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());
輸出:
Developer{name='maliu', salary=10000, age=25} Developer{name='wangwu', salary=9000, age=24} Developer{name='lisi', salary=8000, age=23} Developer{name='zhangsan', salary=7000, age=22}
總結(jié)
以上所述是小編給大家介紹的Java 8 Lambda 表達(dá)式比較器使用示例代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
Sleuth+logback 設(shè)置traceid 及自定義信息方式
這篇文章主要介紹了Sleuth+logback 設(shè)置traceid 及自定義信息方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07IDEA?database和datagrip無法下載驅(qū)動問題解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA?database和datagrip無法下載驅(qū)動問題的解決辦法,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用idea具有一定的參考借鑒價值,需要的朋友可以參考下2024-03-03使用cmd根據(jù)WSDL網(wǎng)址生成java客戶端代碼的實(shí)現(xiàn)
這篇文章主要介紹了使用cmd根據(jù)WSDL網(wǎng)址生成java客戶端代碼的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Java實(shí)現(xiàn)音頻轉(zhuǎn)文本的示例代碼(語音識別)
Java中實(shí)現(xiàn)音頻轉(zhuǎn)文本通常涉及使用專門的語音識別服務(wù),本文主要介紹了Java實(shí)現(xiàn)音頻轉(zhuǎn)文本的示例代碼(語音識別),具有一定的參考價值,感興趣的可以了解一下2024-05-05IDEA 去除 mybatis.xml 文件黃色警告的圖文教程
這篇文章主要介紹了IDEA 去除 mybatis.xml 文件黃色警告的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07