您的位置 首页 java

java-jdk8特性Lamda表达式、增强版Comparator进行集合排序

java-jdk8特性Lamda表达式、增强版Comparator进行集合排序

jdk8特性Lamda表达式、增强版Comparator进行集合排序

工作场景遇见得异常如下:

  Exception  in thread "main" java.lang.NullPointerException
at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216)
at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216)
at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
at java.util.TimSort.sort(TimSort.java:220)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1464)
at com.example.commonbase.listutils.ListSortTest2.main(ListSortTest2.java:16)  
 问题代码,简化如下(这里贴出的是示例)
@Data
public class Student {
 private  String no;
private String name;
private Integer age;
private BigDecimal money;
}
// List排序
public  static   void  main(String[] args) {
List<Student> dataList = ListSortTest2.initData();
dataList.sort(Comparator.comparing(Student::getNo)
.thenComparing(Student::getAge)
.thenComparing(Student::getName).thenComparing(Student::getMoney));
System.out.println("结果时:" +  JSON Object.toJSONString(dataList));
}
public static List<Student> initData() {
List<Student> result = new ArrayList<>();
for(int i=0; i< 10; i++) {
Student element = new Student();
element.setNo("no" + i);
element.setName("name" + i);
element.setAge(i);
element.setMoney(new BigDecimal(i));
result.add(element);
}
{
// 这里特别新增了一个:未赋值no,money
Student element = new Student();
element.setName("name");
element.setAge(100);
result.add(element);
}
return result;
}  

为了解决上述问题,点击进下 Comparator的源码

里面很多调用了方法Objects . requireNonNull(?)

这就要求比对的对象和字段,不可为空。为空时会报上述遇见的异常。

 继续跟进Comparator的源码
/**
* Returns a null-friendly comparator that considers {@code null} to be
* less than non-null. When both are {@code null}, they are considered
* equal. If both are non-null, the specified {@code Comparator} is used
* to determine the order. If the specified comparator is {@code null},
* then the returned comparator considers all non-null values to be equal.
*
* <p>The returned comparator is serializable if the specified comparator
* is  serializable .
*
* @param <T> the type of the elements to be compared
* @param comparator a {@code Comparator} for comparing non-null values
* @return a comparator that considers {@code null} to be less than
* non-null, and compares non-null objects with the supplied
* {@code Comparator}.
* @since 1.8
*/public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
return new Comparators.NullComparator<>(true, comparator);
}
/**
* Returns a null-friendly comparator that considers {@code null} to be
* greater than non-null. When both are {@code null}, they are considered
* equal. If both are non-null, the specified {@code Comparator} is used
* to determine the order. If the specified comparator is {@code null},
* then the returned comparator considers all non-null values to be equal.
*
* <p>The returned comparator is serializable if the specified comparator
* is serializable.
*
* @param <T> the type of the elements to be compared
* @param comparator a {@code Comparator} for comparing non-null values
* @return a comparator that considers {@code null} to be greater than
* non-null, and compares non-null objects with the supplied
* {@code Comparator}.
* @since 1.8
*/public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
return new Comparators.NullComparator<>(false, comparator);
}  

nullsFirst和nullsLast 两个方法。分别是处理null的场景(放在前面/放在后面)。

源码可以看到很多注解: since 1.8 这是1.8版本开始有的新特性哦~

修改之后的代码如下:

 dataList.sort(Comparator.comparing(Student::getNo, 
                                   Comparator.nullsFirst(String::compareTo).reversed())
  .thenComparing(Student::getAge)
.thenComparing(Student::getName)
  .thenComparing(Student::getMoney));  

文章来源:智云一二三科技

文章标题:java-jdk8特性Lamda表达式、增强版Comparator进行集合排序

文章地址:https://www.zhihuclub.com/187134.shtml

关于作者: 智云科技

热门文章

网站地图