Java Comparator.nullsLast方法介绍

x33g5p2x  于2022-09-23 转载在 Java  
字(3.5k)|赞(0)|评价(0)|浏览(625)

nullsLastComparator 功能接口的静态方法。 Java 8 中引入的 Comparator.nullsLast 方法返回一个对 null 友好的比较器,该比较器认为 null 大于非 null。从 Java 源代码中找到它的声明。

static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)

查找 nullsLast 方法返回的比较器的工作情况。
1. 空元素被认为大于非空元素。
2. 当两个元素都为空时,它们被认为是相等的。
3. 当两个元素都不为空时,指定的 Comparator 确定顺序。
4. 如果指定的比较器为空,则返回的比较器将所有非空元素视为相等。

使用 Comparator.nullsLast

找到使用 Comparator.nullsLast 方法的示例。
** NullsLastDemo.java **

package com.concretepage;
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

package com.concretepage;
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

逐案查找解释。
案例 1:我们的集合中有一个空元素。由于 nullsLast 方法,在排序顺序中,空元素将排在最后。非空元素顺序将由传递给 nullsLast 方法的比较器确定。
案例 2:我们有多个空元素。我们知道,当两个元素都为空时,它们被认为是相等的。所以所有的空元素都将排在最后。非空元素顺序将由传递给 nullsLast 方法的比较器确定。
案例 3:在这种情况下,我们将指定的比较器反转为 nullsLast 方法。这只会影响非空元素的顺序。所有空元素将在顺序中排在最后。
案例 4:在这种情况下,我们正在反转 nullsLast 方法返回的比较器。现在所有的 null 元素都将在顺序中排在第一位。
Case-5:在这种情况下,我们通过比较器来使用元素的自然顺序。对于自然顺序,元素类需要实现 Comparable 并覆盖 compareTo 方法。所有 null 元素将按顺序排在最后,非 null 元素将按其自然顺序排列。
案例 6:在这种情况下,我们将 null 传递给 nullsLast 方法。我们知道,如果指定的 nullsLast 比较器为空,则返回的比较器认为所有非空元素相等。所有的 null 元素都将排在最后,并且不会影响非 null 元素的顺序。

相关文章

微信公众号

最新文章

更多