在這個例子中,咱們將向您展現如何使用 java8 lambda
表達式編寫一個 Comparator
來對 List
進行排序。html
Comparator<Developer> byName = new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } };
Comparator<Developer> byName = (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
先新建一個 Developer 類,而後比較 Developer 對象的年齡,一般咱們使用 Collections.sort 並傳遞匿名 Comparator 類,以下所示:java
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; } }
當排序要求改變時,您只需傳入另外一個新的匿名 Comparator 類:git
//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()); } });
這是可行的,可是,您是否以爲僅僅由於想要更改一行代碼就建立一個類有點奇怪?github
在 Java 8 中,List 接口直接支持排序方法,再也不須要使用 Collections.sort。ide
//List.sort() since Java 8 listDevs.sort(new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o2.getAge() - o1.getAge(); } });
//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());
//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()));
//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()));
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);
輸出:spa
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.反向排序code
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());
輸出:htm
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}
源碼見: java-8-demo
系列文章詳見:Java 8 教程對象