在下面例子中,我們將展示怎麼用Java 8 Lambda 運算式去寫一個對List集合排序的Comparator 。
1. Classic Comparator example.
Comparator<Developer> byName = new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getName().compareTo(o2.getName());}};
2. Lambda expression equivalent.
Comparator<Developer> byName =(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1. 不用 Lambda 實現排序 樣本示範用一個 Developer 對象實現對其age屬性的排序功能。正常的,你會用Collections.sort,通過匿名Comparator 比較子實現,如下所示: TestSorting.java
package com.mkyong.java8;import java.math.BigDecimal;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;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);}//sort by ageCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getAge() - o2.getAge();}});System.out.println("After Sort");for (Developer developer : listDevs) {System.out.println(developer);}}private static List<Developer> getDevelopers() {List<Developer> result = new ArrayList<Developer>();result.add(new Developer("mkyong", new BigDecimal("70000"), 33));result.add(new Developer("alvin", new BigDecimal("80000"), 20));result.add(new Developer("jason", new BigDecimal("100000"), 10));result.add(new Developer("iris", new BigDecimal("170000"), 55));return result;}}
Output
Before SortDeveloper [name=mkyong, salary=70000, age=33]Developer [name=alvin, salary=80000, age=20]Developer [name=jason, salary=100000, age=10]Developer [name=iris, salary=170000, age=55]After SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=mkyong, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]
當排序需求改變時,你只能通過一個新的匿名類實現,如下所示:
//sort by ageCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getAge() - o2.getAge();}});//sort by nameCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getName(