【Java 8 新特性】Java Comparator.nullsLast | 将空元素被认为大于非空元素

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值