你好朋友,
在本教程中,我们将看到如何使用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