java8-Lambda中比較器Comparator的使用
此教程旨在讓讀者學會使用lambda並結合Comparator進行集合排序操作
- 典型的比較器示例
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());
不使用Lambda的排序
假如我們要通過Developer 物件的年齡進行排序,通常情況下我們使用Collections.sort,new個匿名Comparator 類,類似下面這種:
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 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);
}
}
private static List<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("ricky", 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;
}
}
輸出結果:
Before Sort
Developer [name=ricky, 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 Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=ricky, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]
當比較規則發生變化時,你需要再次new個匿名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());
}
});
這樣也可以,不過你會不會覺得這樣有點怪,因為其實不同的只有一行程式碼而已,但是卻需要重複寫很多程式碼?
通過lambda進行排序
在java8中,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();
}
});
Lambda 示例
import java.math.BigDecimal;
import java.util.ArrayList;
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);
}
System.out.println("After Sort");
//lambda here!
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
//java 8 only, lambda also, to print the List
listDevs.forEach((developer)->System.out.println(developer));
}
private static List<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("ricky", 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;
}
}
輸出結果:
Before Sort
Developer [name=ricky, 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 Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=ricky, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]
更多的Lambda 例子
根據年齡
//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);
倒序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());
翻譯
ricky 20170728
交流群:244930845
相關文章
- 比較器-Comparable和Comparator
- Java 中比較 BigDecimal 的陷阱JavaDecimal
- 機器學習中比較重要的幾個概念機器學習
- 【Java】Collection.sort以及比較器ComparatorJava
- http協議中比較重要的幾個頭HTTP協議
- Java Comparable排序介面和Comparator比較器介面Java排序
- 關於iOS開發中比較常見的優化iOS優化
- 如何在RFT中比較兩個影像檔案?
- PHP中比較兩個時間的大小與日期的差值PHP
- Java 中 Comparable 和 Comparator 比較Java
- pl/sql中比較好玩的一種連結資料庫方式SQL資料庫
- 我理解的IOC技術在Java和C#中比較分析JavaC#
- Java8-lambdaJava
- java容器之List+Comparable與Comparator比較Java
- 一些開發中比較好用的第三方外掛
- Java8-Lambda表示式Java
- 字串排序 (java comparator介面的使用)字串排序Java
- Comparator.comparing排序使用示例排序
- java的Comparator和ComparableJava
- Comparable和Comparator的區別
- Comparable與Comparator的區別
- Java stream sorted使用 Comparator 進行多欄位排序Java排序
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- fish:Linux中比bash或zsh更好用的ShellLinux
- Java 8 Comparator: 列表排序Java排序
- TreeSet重寫Comparator排序排序
- Java Comparable 與 ComparatorJava
- Java 比較器Java
- Java 集合排序策略介面 ComparatorJava排序
- 不同的Java垃圾回收器的比較Java
- 優先佇列的比較器佇列
- 機器學習常用的分類器比較機器學習
- 主流Web伺服器的比較Web伺服器
- 不同Java垃圾回收器的比較Java
- 使用perl比較mysql的版本MySql
- XTask與RxJava的使用比較RxJava
- substr,substrb,cast的使用、比較AST
- List排序用Collections.sort and Comparator排序