使用Java8的Stream进行多字段排序以及剔除非空字段排序


  使用 Stream的sort() 方法,并结合 Comparator 类 进行排序,主要解决以下两个问题:

  1)当某个字段为空时,怎么进行排序?---使用 Comparator.nullsFirst() 或者 Comparator.nullsLast( ) 进行非空的剔除

  2)如果比较两个字段?---使用  thenComparing( )

 1 package com.demrystv.stonestrong.stone.streamTest;  2  3 import com.alibaba.fastjson.JSON;  4 import org.junit.Test;  5  6 import java.util.Arrays;  7 import java.util.Comparator;  8 import java.util.List;  9 import java.util.stream.Collectors; 10 11 public class StreamController { 12 13  @Test 14 public void streamSortTest(){ 15 User user1 = new User(); 16 user1.setAge(36); 17 user1.setUserName("Bryant"); 18 user1.setAddress("LA"); 19 user1.setPhone("11111"); 20 21 User user2 = new User(); 22 user2.setAge(37); 23 user2.setUserName("James"); 24 user2.setPhone("22222"); 25 26 User user3 = new User(); 27 user3.setAge(39); 28 user3.setUserName("Harden"); 29 user3.setAddress("Houston"); 30 user3.setPhone("33333"); 31 32 User user4 = new User(); 33 user4.setAge(28); 34 user4.setUserName("Durant"); 35 user4.setAddress("NY"); 36 37 User user5 = new User(); 38 user5.setAge(29); 39 user5.setUserName("Wade"); 40 user5.setAddress("Miami"); 41 user5.setPhone("55555"); 42 43 44 45 List<User> userList = Arrays.asList(user1, user2, user3, user4, user5); 46 List<User> collect1 = userList.stream().sorted(Comparator.comparing(User::getAddress, Comparator.nullsFirst(String::compareTo))).collect(Collectors.toList()); 47 System.out.println("根据地址正序排序,null的在前面: "); 48  System.out.println(JSON.toJSONString(collect1)); 49 System.out.println("========================="); 50  System.out.println(); 51 52 List<User> collect2 = userList.stream().sorted(Comparator.comparing(User::getAddress, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList()); 53 System.out.println("根据地址正序排序,null的在后面: "); 54  System.out.println(JSON.toJSONString(collect2)); 55 System.out.println("========================="); 56  System.out.println(); 57 58 List<User> collect3 = userList.stream().sorted(Comparator.comparing(User::getAddress, Comparator.nullsFirst(String::compareTo)).reversed()).collect(Collectors.toList()); 59 System.out.println("根据地址逆序排序,null的在后面: "); 60  System.out.println(JSON.toJSONString(collect3)); 61 System.out.println("========================="); 62  System.out.println(); 63 64 List<User> collect4 = userList.stream().sorted(Comparator.comparing(User::getAddress, Comparator.nullsFirst(String::compareTo)). 65  thenComparing(User::getPhone, Comparator.nullsFirst(String::compareTo)).reversed()).collect(Collectors.toList()); 66 System.out.println("先根据地址正序排序,再根据电话逆序排序,null的在后面: "); 67  System.out.println(JSON.toJSONString(collect4)); 68 System.out.println("========================="); 69  System.out.println(); 70 71  } 72 }

  运行结果如下:

根据地址正序排序,null的在前面: [{"age":37,"phone":"22222","userName":"James"},{"address":"Houston","age":39,"phone":"33333","userName":"Harden"},{"address":"LA","age":36,"phone":"11111","userName":"Bryant"},{"address":"Miami","age":29,"phone":"55555","userName":"Wade"},{"address":"NY","age":28,"userName":"Durant"}] ========================= 根据地址正序排序,null的在后面: [{"address":"Houston","age":39,"phone":"33333","userName":"Harden"},{"address":"LA","age":36,"phone":"11111","userName":"Bryant"},{"address":"Miami","age":29,"phone":"55555","userName":"Wade"},{"address":"NY","age":28,"userName":"Durant"},{"age":37,"phone":"22222","userName":"James"}] ========================= 根据地址逆序排序,null的在后面: [{"address":"NY","age":28,"userName":"Durant"},{"address":"Miami","age":29,"phone":"55555","userName":"Wade"},{"address":"LA","age":36,"phone":"11111","userName":"Bryant"},{"address":"Houston","age":39,"phone":"33333","userName":"Harden"},{"age":37,"phone":"22222","userName":"James"}] ========================= 先根据地址正序排序,再根据电话逆序排序,null的在后面: [{"address":"NY","age":28,"userName":"Durant"},{"address":"Miami","age":29,"phone":"55555","userName":"Wade"},{"address":"LA","age":36,"phone":"11111","userName":"Bryant"},{"address":"Houston","age":39,"phone":"33333","userName":"Harden"},{"age":37,"phone":"22222","userName":"James"}] =========================

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM