使用比较器的nulls对具有null值的列表进行排序

你好朋友,

在本教程中,我们将看到如何使用Java 8 Comparator.nullsFirst在列表中的项目很少为空时如何对项目列表进行排序,以便将null视为列表中的最小元素。

–什么是比较器
– nullsFirst方法在Comparator中做什么
–排序具有非空名称的字符串列表 –不使用nullsFirst排序具有名称和Null的字符串列表 –通过使用nullsFirst方法对列表进行排序来解决上述问题 –对不包含空值的自定义对象列表进行排序 –在不使用nullsFirst的情况下对具有null的Custom对象列表进行排序 –通过使用nullsFirst方法对列表进行排序来解决上述问题 –排序雇员姓名为空的列表

比较器是一个FunctionalInterface,具有以下抽象方法

int比较(T
o1,T
o2);

因此,如果要排序,请说出您的列表。您可以创建一个实现Comparator接口的compare方法的类,其中可以定义排序的逻辑,然后将此比较器传递给list.sort()方法,然后它将根据您的排序定义的逻辑。

另外,您可以将lambda函数(实现Comparator的compare方法)传递给list.sort()方法,而不是创建一个单独的类来实现Comparator接口。

nullsFirst方法在Comparator中做什么?

在Java 8中,Comparator接口中添加了许多默认和静态方法。

nullsFirst是Comparator接口中定义的静态方法之一,具有以下签名:

上市
静态 <T> Comparator <T> nullsFirst(Comparator <?
超级 T> 比较器)

那怎么办呢?

–返回零友好的比较器,该比较器认为null小于非null。

–当两个对象均为空时,它们被视为相等。

–当两者都不为null时,将指定的比较器作为参数传递给nullsFirst方法,以确定排序顺序

–当指定的比较器为null时,返回的比较器将所有非null值视为相等。

要了解nullsFirst的用法,让我们尝试对具有雇员姓名的String列表进行排序,

–首先没有空值

–然后使用空值但不使用nullsFirst

–然后使用null值和nullsFirst

–然后,我们将对自定义Employee对象执行上述步骤

–然后,如果自定义对象中需要根据其进行排序的属性之一为空,那么我们将看到该情况

对具有非空名称的字符串列表进行排序

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.List;  import java.util.Comparator;  public class ComparatorTestWithListOfNamesWithoutNulls { public static void main(String[] args) { List<String> names = Arrays.asList( "Gaurav" , "Tendulkar" , "Suresh" , "Rohit" , "Bumrah" ); System.out.println( "Before Sorting:" ); names.forEach(System.out ::println); names.sort(Comparator.naturalOrder()); System.out.println( "After Sorting:" ); names.forEach(System.out ::println); } 
 } 

这是输出:

排序之前:

高拉夫

滕杜尔卡

苏雷什

罗希特

布姆拉

排序后:

布姆拉

高拉夫

罗希特

苏雷什
滕杜尔卡

在不使用null的情况下对具有名称和null的字符串列表进行排序

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.Comparator;  import java.util.List;  public class ComparatorTestWithListOfNamesAndNulls { public static void main(String[] args) { List<String> names = Arrays.asList( "Gaurav" , null , "Sachin" , "Suresh" , null , "Rohit" , "Jasprit" , null ); System.out.println( "Before Sorting:" ); names.forEach(System.out ::println); names.sort(Comparator.naturalOrder()); System.out.println( "After Sorting:" ); names.forEach(System.out ::println); } 
 } 

这是输出:

排序之前:

高拉夫

空值

萨钦

苏雷什

空值

罗希特

Jasprit

空值

线程“ main”中的异常
java.lang.NullPointerException

在java.base / java.util.Comparators $ NaturalOrderComparator.compare(
Comparators.java:52)

在java.base / java.util.Comparators $ NaturalOrderComparator.compare(
Comparators.java:47)

在java.base / java.util.TimSort.countRunAndMakeAscending(
TimSort.java:355)

在java.base / java.util.TimSort.sort(
TimSort.java:220)

在java.base / java.util.Arrays.sort(
Arrays.java:1442)

在java.base / java.util.Arrays $ ArrayList.sort(
Arrays.java:4426)

在com.blogspot.javasolutionsguide.ComparatorTestWithListOfNamesAndNulls.main(ComparatorTestWithListOfNamesAndNulls.java:12)

正如我们所看到的那样,因为NaturalOrderComparator的compare方法试图通过对一个对象调用compareTo来比较两个o对象,所以我们得到了NullPointerException。

通过使用nullsFirst方法对列表进行排序来解决上述问题

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.List;  import java.util.Comparator;  /** * @author javasolutionsguide * */  public class ComparatorTestWithNullsFirstForListOfNames { public static void main(String[] args) { List<String> names = Arrays.asList( "Gaurav" , null , "Tendulkar" , "Suresh" , null , "Rohit" , "Jasprit" , null ); System.out.println( "Before Sorting:" ); names.forEach(System.out ::println); names.sort(Comparator.nullsFirst(Comparator.naturalOrder())); System.out.println( "After Sorting:" ); names.forEach(System.out ::println); } 
 } 

这是输出:

排序之前:

高拉夫

空值

滕杜尔卡

苏雷什

空值

罗希特

Jasprit

空值

排序后:

空值

空值

空值

高拉夫

Jasprit

罗希特

苏雷什

滕杜尔卡

对自定义对象列表进行排序,不包含空值

我们将创建一个Employee类,它将是一个简单的POJO,如下所示:

 package com.blogspot.javasolutionsguide;  public class Employee { private int id; private String name; private String department; public Employee( int id, String name, String department) { super (); this .id = id; this .name = name; this .department = department; } public int getId() { return id; 
 } public String getName() { return name; } public String getDepartment() { return department; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]" ; }  } 

这是我们的测试课:

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.Comparator;  import java.util.List;  public class ComparatorTestWithListOfEmployeesWithoutNulls { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee( 1 , "Gaurav" , "IT" ), new Employee( 1 , "Tendulkar" , "Admin" ), new Employee( 1 , "Suresh" , "IT" ), new Employee( 1 , "Rohit" , "Admin" ), new Employee( 1 , "Bumrah" , "Admin" )); System.out.println( "Before Sorting:" ); employees.forEach(System.out ::println); System.out.println( "After Sorting:" ); employees.sort(Comparator.comparing(Employee :: getName)); employees.forEach(System.out::println); 
 } 

这是输出:

排序之前:

员工[id = 1,名称= Gaurav,部门= IT]

员工[id = 1,名称= Tendulkar,部门=管理员]

员工[id = 1,姓名= Suresh,部门= IT]

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,名称= Bumrah,部门=管理员]

排序后:

员工[id = 1,名称= Bumrah,部门=管理员]

员工[id = 1,名称= Gaurav,部门= IT]

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,姓名= Suresh,部门= IT]

员工[id = 1,名称= Tendulkar,部门=管理员]

不使用null排序具有null的自定义对象列表

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.Comparator;  import java.util.List;  public class ComparatorTestWithListOfEmployeesWithNulls { public static void main(String[] args) {  List<Employee> employees = Arrays.asList( new Employee( 1 , "Gaurav" , "IT" ), null , new Employee( 1 , "Tendulkar" , "Admin" ), new Employee( 1 , "Suresh" , "IT" ), 
 null , new Employee( 1 , "Rohit" , "Admin" ), new Employee( 1 , "Bumrah" , "Admin" ), null ); employees.sort(Comparator.comparing(Employee::getName)); employees.forEach(System.out::println); 
 } 
 } 

这是输出:

排序之前:

员工[id = 1,名称= Gaurav,部门= IT]

空值

员工[id = 1,名称= Tendulkar,部门=管理员]

员工[id = 1,姓名= Suresh,部门= IT]

空值

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,名称= Bumrah,部门=管理员]

空值

线程“ main”中的异常
java.lang.NullPointerException

在java.base / java.util.Comparator.lambda $ comparing $ 77a9974f $ 1(
比较器(java:469)

在java.base / java.util.TimSort.countRunAndMakeAscending(
TimSort.java:355)

在java.base / java.util.TimSort.sort(
TimSort.java:220)

在java.base / java.util.Arrays.sort(
Arrays.java:1442)

在java.base / java.util.Arrays $ ArrayList.sort(
Arrays.java:4426)

在com.blogspot.javasolutionsguide.ComparatorTestWithListOfEmployeesWithNulls.main(ComparatorTestWithListOfEmployeesWithNulls.java:19)

通过使用nullsFirst方法对列表进行排序来解决上述问题

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.Collections;  import java.util.Comparator;  import java.util.List;  public class ComparatorTestWithListOfEmployeesWithNullsAndNullsFirst { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee( 1 , "Gaurav" , "IT" ), null , new Employee( 1 , "Tendulkar" , "Admin" ), new Employee( 1 , "Suresh" , "IT" ), 
 null , new Employee( 1 , "Rohit" , "Admin" ), new Employee( 1 , "Bumrah" , "Admin" ), null ); Collections.sort(employees ,Comparator.nullsFirst((emp1 ,emp2) -> emp1.getName().compareToIgnoreCase(emp2.getName()))); employees.forEach(System.out::println); }  } 

这是输出:

空值

空值

空值

员工[id = 1,名称= Bumrah,部门=管理员]

员工[id = 1,名称= Gaurav,部门= IT]

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,姓名= Suresh,部门= IT]

员工[id = 1,名称= Tendulkar,部门=管理员]

排序雇员姓名为null的列表

 package com.blogspot.javasolutionsguide;  import java.util.Arrays;  import java.util.Comparator;  import java.util.List;  public class ComparatorTestWithListOfEmployeesWithNullNamesAndNullsFirst { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee( 1 , "Gaurav" , "IT" ), new Employee( 1 , "Tendulkar" , "Admin" ), new Employee( 1 , null , "IT" ), new Employee( 1 , "Rohit" , "Admin" ), new Employee( 1 , "Bumrah" , "Admin" )); System.out.println( "Before Sorting:" ); employees.forEach(System.out ::println); employees.sort(Comparator.comparing(Employee::getName,Comparator.nullsFirst(Comparator.naturalOrder()))); System.out.println( "After Sorting:" ); employees.forEach(System.out::println); }  } 

这是输出:

排序之前:

员工[id = 1,名称= Gaurav,部门= IT]

员工[id = 1,名称= Tendulkar,部门=管理员]

员工[id = 1,姓名=空,部门= IT]

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,名称= Bumrah,部门=管理员]

排序后:

员工[id = 1,姓名=空,部门= IT]

员工[id = 1,名称= Bumrah,部门=管理员]

员工[id = 1,名称= Gaurav,部门= IT]

员工[id = 1,名称= Rohit,部门=管理员]

员工[id = 1,名称= Tendulkar,部门=管理员]

摘要

当我们拥有很少的元素为null的元素列表并且希望将这些null视为列表中最小的元素时,我们可以使用Comparator接口的nullsFirst方法,该方法执行以下操作:

返回一个对null友好的比较器,该比较器认为null小于非null。

–当两个对象均为空时,它们被视为相等。

–当两者都不为null时,将指定的比较器作为参数传递给nullsFirst方法,以确定排序顺序

–当指定的比较器为null时,返回的比较器将所有非null值视为相等。

谢谢阅读。 如果您喜欢该帖子,则可以共享它并可以订阅此博客以获取更多此类帖子。

翻译自: https://www.javacodegeeks.com/2020/02/sorting-a-list-having-null-values-with-comparators-nullsfirst.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jar Hell变得轻松–用jHades揭开类路径的神秘面纱

Java开发人员将不得不面对的最困难的问题是类路径错误&#xff1a; ClassNotFoundException &#xff0c; NoClassDefFoundError &#xff0c;Jar Hell&#xff0c; Xerces Hell和公司。 在本文中&#xff0c;我们将探究这些问题的根本原因&#xff0c;并了解最小的工具&#…

分度器中硒定位器的完整指南(示例)

在测试网站的功能时&#xff0c;特别是Web元素&#xff08;例如单选按钮&#xff0c;文本框&#xff0c;下拉列表等&#xff09;&#xff0c;您需要确保能够访问这些元素。 Selenium定位器正是出于这个目的&#xff0c;通过使用此命令&#xff0c;我们可以识别这些Web元素DOM&a…

wildfly管理控制台_WildFly 9 –别希望您的控制台像这样!

wildfly管理控制台每个人都可能听到这个消息。 周一发布了第一个WildFly 9.0.0.Alpha1版本。 您可以从wildfly.org网站上下载它&#xff0c;最大的变化是它是由一个新的功能配置工具构建的&#xff0c;该工具位于现在单独的核心发行版上&#xff0c;还包含一个新的Servlet发行版…

azure mysql sql,UiPath连接Azure Sql Server数据库

一、创建数据库在Azure中创建SQL数据库image更改防火墙设置&#xff0c;并设置客户端IP访问规则image二、安装数据源驱动在本地安装数据源驱动程序&#xff0c;保证可以正常接入到远程的数据库。如果不安装驱动程序&#xff0c;则会出现以下报错&#xff1a;[Microsoft][ODBC D…

linux 误删除mysql表能恢复吗,Linux误删数据恢复

引子指在键上飘&#xff0c;难免会湿手套。当你按下shiftdel键后&#xff0c;会不会突然心里凉透&#xff0c;当你执行rm -rf后&#xff0c;会不会马上去搜索哪个国家入境不需要签证。或者你还会遇到如下的情况&#xff1a;root4xem7:~# aliasalias cdrm -rfalias ddocker数据恢…

Apache Camel 3.1 –更多骆驼核心优化(第3部分)

我以前曾在博客中介绍过我们在下一个Camel 3.1版本中所做的优化 博客第1部分 博客第2部分 今天&#xff0c;我想简短介绍一下我们已经完成的最新开发&#xff0c;因为我们准备在本周末或下半年准备好构建和发布Camel 3.1。 从第2部分开始&#xff0c;我们设法在路由过程中将…

jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览

jvm jinfo 参数在最近的一些博客中&#xff08;特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书中的评论中&#xff09;&#xff0c;我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是&#xff0c;我从来没有专门解决过漂亮的jinfo工具&#…

49自动化测试中最常见的硒异常

开发人员将始终在编写代码时牢记不同的场景&#xff0c;但是在某些情况下&#xff0c;实现可能无法按预期工作。 相同的原则也适用于测试代码&#xff0c;该代码主要用于测试现有产品的功能&#xff0c;发现错误以及使产品100&#xff05;不受错误影响。 正确地说&#xff0c;…

鹰式价差matlab,鹰式期权:什么叫铁鹰式期权组合,蝶式价差期权?

蝶式期权套利 是利用 交割月份的价差进行 套期获利&#xff0c; 个方向相 反、 共享居中交割月份合约的跨期套利组成。是一种期权策略&#xff0c;风险有限&#xff0c;盈利也有限&#xff0c;是由一手牛市套利和一手熊市套利组合而成的。铁鹰式期权组合是牛市看跌价差期权组合…

angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分

angular8 rest这是Angular JS承诺的Java EE 7的后续版本–第1部分 。 花了比我预期更长的时间&#xff08;找到时间来准备代码和博客文章&#xff09;&#xff0c;但是终于到了&#xff01; 应用程序 第1部分中的原始应用程序只是带有分页的简单列表&#xff0c;以及提供列表数…

带有Java Pojo作为输入输出示例的AWS Lambda函数

在上一教程中&#xff0c;我们看到了如何使用Java创建AWS Lambda函数&#xff0c;并传递了String作为输入&#xff0c;还返回了String作为Output。如果您是第一次创建lambda函数&#xff0c;我建议先阅读该教程。 在本教程中&#xff0c;我们将看到如何传递Java普通的旧Java对…

php右侧弹窗QQ客服,JavaScript_网页右侧悬浮滚动在线qq客服代码示例,网页右侧悬浮滚动QQ在线客服 - phpStudy...

网页右侧悬浮滚动在线qq客服代码示例网页右侧悬浮滚动QQ在线客服代码function myEvent(obj,ev,fn){if (obj.attachEvent){obj.attachEvent(onev,fn);}else{obj.addEventListener(ev,fn,false);};};function getbyClass(id,sClass){var oParent document.getElementById(id);va…

idea spark java,IntelliJ Idea 搭建spark 开发环境

笔者介绍的是在MAC环境下使用Idea搭建spark环境。环境:spark 2.0.0scala 2.11.8maven 3.9.9idea 151.Idea的安装.Idea可以在官网上下载。熟悉java的肯定都知道这个开发利器&#xff0c;可以在官网上进行下载&#xff0c;在此就不在赘述。有免费的和付费版本&#xff0c;对于我们…

optaplanner_OptaPlanner –具有真实道路距离的车辆路线

optaplanner在现实世界中&#xff0c;车辆路径问题&#xff08;VRP&#xff09;中的车辆必须走这条路&#xff1a;它们不能在客户之间直线行驶。 大多数VRP研究论文和演示都乐于忽略此实现细节。 和我一样&#xff0c;过去。 尽管使用道路距离&#xff08;而不是空中距离&#…

java中的jpa_JPA教程–在Java SE环境中设置JPA

java中的jpaJPA代表Java Persistence API&#xff0c;它基本上是一个规范&#xff0c;描述了一种将数据持久存储到持久存储&#xff08;通常是数据库&#xff09;中的方法。 我们可以将其视为类似于Hibernate之类的ORM工具的东西&#xff0c;除了它是Java EE规范的正式组成部分…

php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

本文实例讲述了php中加密解密DES类的简单使用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在平时的开发工作中&#xff0c;我们经常会对关键字符进行加密&#xff0c;可能为了安全 也可能为了规范&#xff0c;所以要正确使用DES加密解密代码1:class DES{var $k…

java 并发线程_Java并发教程–线程之间的可见性

java 并发线程当在不同线程之间共享对象的状态时&#xff0c;除了原子性外&#xff0c;其他问题也会发挥作用。 其中之一是可见性。 关键事实是&#xff0c;如果没有同步&#xff0c;则不能保证指令按照它们在源代码中出现的顺序执行。 这不会影响单线程程序中的结果&#xff…

维持硒测试自动化的完美方法

毫无疑问&#xff0c; 自动浏览器测试已经改变了软件开发的工作方式。 如果不是Selenium&#xff0c;我们将无法像我们一样使用各种各样的无错误Web应用程序。 但是有时&#xff0c;甚至IT部门也误解了自动化一词。 大多数人认为计算机将为他们完成所有测试&#xff01; 他们最…

双色球霸主网络问题_霸主–统治和管理API的地方

双色球霸主网络问题今天我们生活在一个越来越分散的世界中。 如今的计算机系统不再是在随机桌子下面的某些硬件上运行单个部门项目&#xff0c;而是大规模&#xff0c;集中甚至分散地运行。 监视和管理的需求从未改变&#xff0c;但是随着时间的推移变得越来越复杂。 如果将所有…

php验证码 php中文网,ThinkPHP 使用不同风格及中文的验证码

使用其他风格验证码在上文《ThinkPHP 验证码详解及实例》中了解了 ThinkPHP 验证码的具体用法&#xff0c;本文将进一步介绍如何使用不同风格的验证码以及使用中文验证码。上文例子使用的是默认参数&#xff0c;也就是生成 4 位的数字验证码。buildImageVerify 方法生成验证码时…