Java Comparator.nullsLast | 将空元素被认为大于非空元素
nullsLast
是比较器功能接口的静态方法。
在Java 8
中引入的Comparator.nullsLast
方法返回一个对null
友好的比较器,认为null
大于非null
。
从Java
源代码中找到它的声明。
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
找到由nullsLast
方法返回的比较器的工作原理。
1. 空元素被认为是大于非空元素的。
2. 当两个元素都是空的时候,那么它们被认为是相等的。
3. 当两个元素都是非空的时候,指定的比较器决定了顺序。
4. 如果指定的比较器是空的,那么返回的比较器认为所有非空的元素是相等的。
使用 Comparator.nullsLast
找到使用Comparator.nullsLast
方法的例子。
NullsLastDemo.java
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class NullsLastDemo {
public static void main(String[] args) {
Student s1 = new Student("Ram", 18);
Student s2 = new Student("Shyam", 22);
Student s3 = new Student("Mohan", 17);
System.out.println("-------Case1: One null----------");
List<Student> list = Arrays.asList(s1, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(Comparator.comparing(Student::getName)));
list.forEach(s -> System.out.println(s));
System.out.println("--------Case2: More than one null---------");
list = Arrays.asList(s1, null, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(Comparator.comparing(Student::getName)));
list.forEach(s -> System.out.println(s));
System.out.println("--------Case3: Reverse specified Comparator to nullsLast---------");
list = Arrays.asList(s1, null, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(Comparator.comparing(Student::getName).reversed()));
list.forEach(s -> System.out.println(s));
System.out.println("--------Case4: Reverse Comparator returned by nullsLast---------");
list = Arrays.asList(s1, null, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(Comparator.comparing(Student::getName)).reversed());
list.forEach(s -> System.out.println(s));
System.out.println("--------Case5: Specify natural order Comparator to nullsLast---------");
list = Arrays.asList(s1, null, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(Comparator.naturalOrder()));
list.forEach(s -> System.out.println(s));
System.out.println("--------Case6: Specify null to nullsLast---------");
list = Arrays.asList(s1, null, s2, null, s3);
Collections.sort(list, Comparator.nullsLast(null));
list.forEach(s -> System.out.println(s));
}
}
Student.java
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student o) {
return name.compareTo(o.getName());
}
@Override
public String toString() {
return name + "-" + age;
}
}
输出
-------Case1: One null----------
Mohan-17
Ram-18
Shyam-22
null
--------Case2: More than one null---------
Mohan-17
Ram-18
Shyam-22
null
null
--------Case3: Reverse specified Comparator to nullsLast---------
Shyam-22
Ram-18
Mohan-17
null
null
--------Case4: Reverse Comparator returned by nullsLast---------
null
null
Shyam-22
Ram-18
Mohan-17
--------Case5: Specify natural order Comparator to nullsLast---------
Mohan-17
Ram-18
Shyam-22
null
null
--------Case6: Specify null to nullsLast---------
Ram-18
Shyam-22
Mohan-17
null
null
示例说明
Case-1: 我们的集合中有一个空元素。在排序中,由于nullsLast
方法的存在,空元素将排在最后。非空元素的顺序将由传递给nullsLast
方法的比较器决定。
Case-2: 我们有一个以上的空元素。我们知道,当两个元素都是空的时候,那么它们被认为是相等的。所以,所有的空元素将被排在最后。非空元素的顺序将由传递给nullsLast
方法的比较器决定。
Case-3: 在这种情况下,我们将指定的比较器反转到nullsLast
方法。这将只影响非空元素的顺序。所有的空元素将被排在最后。
Case-4: 在这种情况下,我们将nullsLast
方法返回的比较器反转。现在,所有的空元素将被排在第一位。
Case-5: 在这种情况下,我们通过比较器来使用元素的自然顺序。对于自然顺序,元素类需要实现Comparable
和覆盖compareTo
方法。所有的空元素将被排在最后,非空元素将被排在其自然顺序上。
Case-6: 在这种情况下,我们将null
传递给nullsLast
方法。我们知道,如果指定给nullsLast
的比较器是null
,那么返回的比较器认为所有非null
元素都是相等的。所有的空元素将被排在最后,对非空元素的顺序没有影响。
参考文献
【1】Interface Comparator
【2】Java Comparator.comparing
【3】Java Comparator.nullsLast