Java Comparator.nullsFirst | 将空元素被认为小于非空元素

  • 使用 Comparator.nullsFirst
  • 参考文献

nullsFirst是比较器功能接口的静态方法。

Java 8中引入的Comparator.nullsFirst方法返回一个对null友好的比较器,认为null小于非null

Java源代码中找到它的声明。

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

找到由nullsFirst方法返回的比较器的工作原理。
1. 空元素被认为小于非空元素。
2. 当两个元素都是空的时候,那么它们被认为是相等的。
3. 当两个元素都是非空的时候,指定的比较器决定了顺序。
4. 如果指定的比较器是空的,那么返回的比较器认为所有非空的元素是相等的。

使用 Comparator.nullsFirst

找到使用Comparator.nullsFirst方法的例子。

NullsFirstDemo.java

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class NullsFirstDemo {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.nullsFirst(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.nullsFirst(Comparator.comparing(Student::getName)));list.forEach(s -> System.out.println(s));System.out.println("--------Case3: Reverse specified Comparator to nullsFirst---------");list = Arrays.asList(s1, null, s2, null, s3);Collections.sort(list, Comparator.nullsFirst(Comparator.comparing(Student::getName).reversed()));list.forEach(s -> System.out.println(s));System.out.println("--------Case4: Reverse Comparator returned by nullsFirst---------");list = Arrays.asList(s1, null, s2, null, s3);Collections.sort(list, Comparator.nullsFirst(Comparator.comparing(Student::getName)).reversed());list.forEach(s -> System.out.println(s));System.out.println("--------Case5: Specify natural order Comparator to nullsFirst---------");list = Arrays.asList(s1, null, s2, null, s3);Collections.sort(list, Comparator.nullsFirst(Comparator.naturalOrder()));list.forEach(s -> System.out.println(s));System.out.println("--------Case6: Specify null to nullsFirst---------");list = Arrays.asList(s1, null, s2, null, s3);Collections.sort(list, Comparator.nullsFirst(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;}@Overridepublic int compareTo(Student o) {return name.compareTo(o.getName());}@Override  public String toString(){return name + "-" + age; }
}

输出

-------Case1: One null----------
null
Mohan-17
Ram-18
Shyam-22
--------Case2: More than one null---------
null
null
Mohan-17
Ram-18
Shyam-22
--------Case3: Reverse specified Comparator to nullsFirst---------
null
null
Shyam-22
Ram-18
Mohan-17
--------Case4: Reverse Comparator returned by nullsFirst---------
Shyam-22
Ram-18
Mohan-17
null
null
--------Case5: Specify natural order Comparator to nullsFirst---------
null
null
Mohan-17
Ram-18
Shyam-22
--------Case6: Specify null to nullsFirst---------
null
null
Ram-18
Shyam-22
Mohan-17

示例说明

Case-1: 我们的集合中有一个空元素。由于nullsFirst方法返回的比较器,在排序中,null元素将排在第一位。非空元素的顺序将由传递给nullsFirst方法的比较器决定。

Case-2: 我们有一个以上的空元素。我们知道,当两个元素都是空的时候,那么它们被认为是相等的。所以,所有的空元素将被排在第一位。非空元素的顺序将由传递给nullsFirst方法的比较器决定。

Case-3: 在这种情况下,我们将指定的比较器反转到nullsFirst方法。这将只影响非空元素的顺序。所有的空元素将被排在第一位。

Case-4: 在这种情况下,我们将nullsFirst方法返回的比较器反转。现在,所有的空元素将被排在最后。

Case-5: 在这种情况下,我们通过比较器来使用元素的自然顺序。对于自然顺序,元素类需要实现Comparable和覆盖compareTo方法。所有的空元素将按顺序排在第一位,非空元素将按其自然顺序排列。

Case-6: 在这种情况下,我们将null传递给nullsFirst方法。我们知道,如果指定给nullsFirst的比较器是null,那么返回的比较器会认为所有非null元素都是相等的。所有的空元素将被排在第一位,对非空元素的顺序没有影响。

参考文献

【1】Interface Comparator
【2】Java Comparator.comparing
【3】Java Comparator.nullsFirst

【Java 8 新特性】Java Comparator.nullsFirst | 将空元素被认为小于非空元素相关推荐

  1. Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击关注公众号,实用技术文章及时了解 来源:moonce.blog.csdn.net/article/ details/120324130 naturalOrder是比较器功能接口的静态方法. Jav ...

  2. 【289期】Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... natur ...

  3. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  4. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  5. java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...

  6. java自动化测试语言高级之Java 8 新特性

    java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...

  7. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  8. 【Java 8 新特性】Java Comparator | 比较器

    Java Comparator | 比较器 比较器功能方法:compare(T o1, T o2) 1. 使用 Lambda 表达式定义 compare 2. 自定义 compare 实现比较器 比较 ...

  9. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

最新文章

  1. 局域网瘫痪 傀儡主机的DDoS***
  2. Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现
  3. Python 基础语法(一)
  4. python饼状图教程_Python数据可视化:饼状图的实例讲解
  5. 理论 | 教你彻底学会Java序列化和反序列化
  6. 宠物也能买保险了!鼻纹识别就能建立专属电子档案
  7. App导航设计全面梳理——可临摹素材原型模版,轻松缕清思路!
  8. Servlet 数据库访问
  9. vim 使用、设置笔记
  10. (四) 数据库表基本操作
  11. event mpm php,Ubuntu Apache 切换到php-fpm+mpm_event模式
  12. 【人脸表情识别】基于matlab GUI LBP+SVM脸部动态特征人脸表情识别【含Matlab源码 1369期】
  13. winXP系统如何打开剪贴板查看器
  14. 番茄ToDo帮助文档
  15. mov 指令用c语言写,汇编总结:mov指令
  16. PNAS:大脑是如何计算主观价值的?
  17. obd协议 混动车_OBD协议介绍
  18. 这几个算法可视化网站,太牛了!
  19. ECshop文件结构说明
  20. 斗鱼直播Android开发二面被刷,好文推荐

热门文章

  1. 计算机文化宣传,计算机文化节活动宣传总策划书(doc 42页)
  2. 2017.10.18——用户体验分析:以“南通市妇幼保健院微信公众号”为例
  3. PageHelper分页插件使用 及原理
  4. Java集合——List接口学习总结
  5. OpenCV.高斯模糊
  6. 3.7V升压5V2A,锂电池升压5V2.4A方案
  7. 如何在UEFI模式下安装64位win7系统
  8. 织梦dedecms响应式房产中介房产代理公司网站模板(自适应手机移动端)
  9. uniapp 语法基础
  10. 网站地图是什么?怎么生成?格式有哪些?