Java stream sorted自定義排序規則實現多字段排序
??Stream 提供了豐富的操作(中間操作和終端操作)集合元素的輪子,但Stream流操作不影響原始集合數據,執行結果是一個新的集合對象。在《Java stream sorted使用 Comparator 進行多字段排序》中,小編Wiener介紹了使用Java Stream流排序器Comparator對List集合進行多字段排序的方法,包括復雜實體對象多字段升降序排序方法,本文介紹兩個新的排序方法:
??1. 使用lambda表達式自定義排序規則;
??2. 使用匿名內部類重寫Comparator方法以定義排序規則。
??測試數據中,類繼續使用《Java stream sorted使用 Comparator 進行多字段排序》中的UserDTO,如下所示:
private static List<UserDTO> getUsers() {
List<UserDTO> users = new ArrayList<>();
users.add(new UserDTO(1L, "bWiener", 28, true));
users.add(new UserDTO(2L, "張莉", 17, false));
users.add(new UserDTO(3L, "李雪", 20, true));
users.add(new UserDTO(6L, "王二", 27, true));
users.add(new UserDTO(7L, "店小二", 27, false));
users.add(new UserDTO(8L, "樓蘭胡楊", 21, true));
users.add(new UserDTO(9L, "aPrice", 28, true));
return users;
}
使用lambda表達式實現排序
??lambda表達式又稱為函數式編程,匿名函數可以將匿名函數代碼塊作為請求參數,語法更加簡潔清爽,代碼風格更加緊湊。使用lambda表達式修改sorted定義排序規則:
/**
* 使用lambda表達式定義排序規則
* 先按姓名降序,若年齡相同則按姓名降序
*/
private static void defineOrderByLambda() {
List<UserDTO> list = getUsers();
list.stream().sorted((e1, e2) -> {
if (e2.getAge().equals(e1.getAge())) {
return e2.getName().compareTo(e1.getName());
}
return Integer.compare(e2.getAge(), e1.getAge());
}).forEach(System.out::println);
}
匿名內部類重寫Comparator方法實現排序
??先創建Comparator接口的匿名內部類對象,然后在匿名內部類對象中重寫compare方法,以實現排序。下述案例排序規則:先以年齡降序排列,再以姓名降序排列:
/**
* 使用匿名內部類重寫Comparator方法以定義排序規則
*/
private static void defineOrderByInnerClass() {
List<UserDTO> list = getUsers();
list.stream().sorted(new Comparator<UserDTO>() {
@Override
public int compare(UserDTO e1, UserDTO e2) {
if (e2.getAge().equals(e1.getAge())) {
return e2.getName().compareTo(e1.getName());
}
return Integer.compare(e2.getAge(), e1.getAge());
}
}).forEach(System.out::println);
}
??在Stream sorted() 中指定按照實體類的某個屬性進行排序時,默認的排序規則是升序,如果需要降序,就需要調整對象的位置,使用對象2與對象1進行比較即可實現降序需求!
??基于如下測試用例進行驗證,發現這兩種排序方式都好用:
public static void main(String[] args) {
defineOrderByLambda();
System.out.println("----------");
defineOrderByInnerClass();
}
??執行結果:
UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=樓蘭胡楊, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=張莉, age=17, isBoy=false)
----------
UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=樓蘭胡楊, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=張莉, age=17, isBoy=false)
結束語
??文章到這里就結束了,看完之后你有什么想法想要跟大家分享呢?評論區在等著你!
讀后有收獲,小禮物走一走,請作者喝咖啡。
Buy me a coffee. ?Get red packets.作者:樓蘭胡楊
本文版權歸作者和博客園共有,歡迎轉載,但請注明原文鏈接,并保留此段聲明,否則保留追究法律責任的權利。

浙公網安備 33010602011771號