Java 8 – 如何对具有空值的列表和数组进行排序?
Java 8 - 如何对具有空值的列表和数组进行排序? - BenchResources.Net
在本文中,我们将了解如何对存在空值的对象列表和数组进行排序
通常,对其中包含一个或多个空值的任何列表/数组进行排序,会导致在将空值与其他值进行比较时抛出NullPointerException
要解决此NullPointerException,我们必须在Comparator逻辑内处理 null 值(在 Java 8 方法之前),或者使用Java 8中引入的Comparator接口的静态方法nullsFirst()和nullsLast()
对具有空值的列表和数组进行排序:
让我们在不同的子主题下讨论这个主题,如下所示,
- 对具有空值的列表进行排序时抛出NullPointerException
- Java 8之前–排序时手动处理空值
- Java 8 –具有空值的整数排序列表
- Java 8 –具有空值的字符串排序列表
- Java 8 –具有空值的Customer对象的排序列表
- Java 8 –过滤掉空值并对字符串元素进行排序
- 收藏。排序()方法
- 数组。排序()方法
1. 对空值列表进行排序时抛出 NullPointerException :
- 在这里,我们尝试对包含空值的字符串元素列表进行排序
- 在下面的示例中,在比较null值时Comparator抛出NullPointerException
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;public class SortingNullValuesThrowsNPE { public static void main(String[] args) { // 1. string list List<String> names = Arrays.asList( null, "Kimi", "Michael", null, "Alonso", "Narain", null ); // 2.1 Sorting list with null values Collections.sort(names, Comparator.naturalOrder()); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
Exception in thread "main" java.lang.NullPointerException at java.lang.String.compareTo(String.java:1155) at java.lang.String.compareTo(String.java:111) at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:52) at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.util.TimSort.sort(TimSort.java:220) at java.util.Arrays.sort(Arrays.java:1438) at java.util.Arrays$ArrayList.sort(Arrays.java:3895) at java.util.Collections.sort(Collections.java:175) at net.bench.resources.stream.sorting.nullvalues.SortingNullValuesThrowsNPE.main(SortingNullValuesThrowsNPE.java:24) |
2. Java 8之前 – 排序时手动处理空值:
- 为了摆脱我们在上一个示例中遇到的NullPointerException,我们将在比较器逻辑中手动处理空值,方法是将它们推到最后
- 但我们仍然必须通过在比较器内部编写/编码/开发逻辑来将空值推到第一个/最后一个位置,从而使我们的双手变得肮脏
- 一种更优雅的方法是使用Java 8 的 Comparator接口中引入的静态方法(nullsFirst和nullsLast),我们将在下面的示例中看到。3
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;public class SortingBeforeJava8Approach { public static void main(String[] args) { // 1. string list List<String> names = Arrays.asList( null, "Kimi", "Michael", null, "Alonso", "Narain", null ); // 1.1 printing original names list System.out.println("Unsorted names list with NULL values :- \n"); names.forEach(System.out::println); // 2. System.out.println("\n\nCollections.sort() with NULL values Last:- \n"); // 2.1 Sorting using Collections.sort() with null values last Collections.sort(names, new Comparator<String>() { @Override public int compare(String str1, String str2) { if(null == str1) { return null == str2 ? 0 : 1; } else if(null == str2) { return -1; } return str1.compareTo(str2); } }); // 2.2 print to console names.forEach(System.out::println); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Unsorted names list with NULL values :- nullKimiMichaelnullAlonsoNarainnullCollections.sort() with NULL values Last:- AlonsoKimiMichaelNarainnullnullnull |
3. Java 8 – 具有空值的整数排序列表:
- 在这里,我们使用Comparator接口的静态方法nullsFirst()和nullsLast()对包含null值的整数列表进行排序
- 比较器。nullsFirst() – 该比较器有助于将null值推到第一个/起始位置
- 比较器。nullsLast() – 该比较器有助于将null值推到最后/结束位置
- 其余非空整数值将根据作为参数传递给静态方法的比较器按升序/降序排序,即;nullsFirst()和nullsLast()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Comparator;import java.util.List;public class IntegerSortingUsingJava8 { public static void main(String[] args) { // integer list List<Integer> names = Arrays.asList( 97, null, 63, 19, null, 86, 23, null ); // printing original number list System.out.println("Unsorted number list with NULL values :- \n"); names.forEach(System.out::println); // stream sorting with null values first System.out.println("\n\nSorted number list with NULL values First:- \n"); names .stream() .sorted(Comparator.nullsFirst(Comparator.naturalOrder())) .forEach(System.out::println); // stream sorting with null values last System.out.println("\n\nSorted number list with NULL values Last:- \n"); names .stream() .sorted(Comparator.nullsLast(Comparator.naturalOrder())) .forEach(System.out::println); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
Unsorted number list with NULL values :- 97null6319null8623nullSorted number list with NULL values First:- nullnullnull1923638697Sorted number list with NULL values Last:- 1923638697nullnullnull |
4. Java 8 – 具有空值的字符串排序列表:
- 在这里,我们使用Comparator接口的静态方法nullsFirst()和nullsLast()对包含null值的 String 元素列表进行排序
- 比较器。nullsFirst() – 这个比较器有助于将null值推到第一个/起始位置,并且为了对其余非 null String 元素进行排序,我们可以传递Comparator.naturalOrder()或Comparator.reverseOrder()以自然/反向顺序获得结果分别
- 比较器。nullsLast() – 此比较器有助于将空值推到最后/结束位置,并且类似地可以对其余非空项目进行排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Comparator;import java.util.List;public class StringSortingUsingJava8 { public static void main(String[] args) { // string list List<String> names = Arrays.asList( null, "Kimi", "Michael", null, "Alonso", "Narain", null ); // printing original names list System.out.println("Unsorted names list with NULL values :- \n"); names.forEach(System.out::println); // stream sorting with null values first System.out.println("\n\nSorted names list with NULL values First:- \n"); names .stream() .sorted(Comparator.nullsFirst(Comparator.naturalOrder())) .forEach(System.out::println); // stream sorting with null values last System.out.println("\n\nSorted names list with NULL values Last:- \n"); names .stream() .sorted(Comparator.nullsLast(Comparator.naturalOrder())) .forEach(System.out::println); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
Unsorted names list with NULL values :- nullKimiMichaelnullAlonsoNarainnullSorted names list with NULL values First:- nullnullnullAlonsoKimiMichaelNarainSorted names list with NULL values Last:- AlonsoKimiMichaelNarainnullnullnull |
5. Java 8 – 对具有空值的 Customer 对象进行排序:
- 我们将根据名称按字母顺序对包含空值的 Customer 对象列表进行排序
- 比较器。nullsFirst() – 这个比较器有助于将null值推到第一个/起始位置,并根据名称对其余非空 Customer 对象进行排序,我们可以将Lambda 表达式或方法引用传递 给Stream的sorted()方法
- 比较器。nullsLast() – 此比较器有助于将null值推到最后/结束位置,并且类似于根据名称对其余非空 Customer 对象进行排序,我们可以将Lambda 表达式或方法引用传递给Stream的sorted()方法
Customer.java
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package net.bench.resources.stream.sorting.nullvalues;public class Customer { // member variables String custName; String custCity; Integer custAge; // 3-arg parameterized constructor // getters & setters // toString() method} |
CustomerSortingUsingJava8.java
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;public class CustomerSortingUsingJava8 { // customer list private static List<Customer> getUnSortedCustomers() { return Arrays.asList( null, new Customer("Sneha", "Pune", 73), new Customer("Simran", "Bangalore", 37), new Customer("Nayanthara", "Hyderabad", 52), new Customer("Shalini", "Chennai", 70), null, new Customer("Abirami", "Bangalore", 48), new Customer("Trisha", "Mangalore", 45), null ); } public static void main(String[] args) { // get customer list List<Customer> unsortedCustomerList = getUnSortedCustomers(); System.out.println("Before Sorting: Customer list :- \n"); unsortedCustomerList.stream().forEach(System.out::println); System.out.println("\n\nSorted Customer list on Name" + " with NULL values First :- \n"); // inline - sorting on multiple fields List<Customer> sortedCustomerListWithNullFirst = unsortedCustomerList .stream() .sorted(Comparator.nullsFirst(Comparator .comparing(Customer::getCustName))) .collect(Collectors.toList()); // collect sorted customers to new list // print new list to console using forEach() sortedCustomerListWithNullFirst.stream().forEach(System.out::println); System.out.println("\n\nSorted Customer list on Name" + " with NULL values Last :- \n"); // inline - sorting on multiple fields List<Customer> sortedCustomerListWithNullLast = unsortedCustomerList .stream() .sorted(Comparator.nullsLast(Comparator .comparing(Customer::getCustName))) .collect(Collectors.toList()); // collect sorted customers to new list // print new list to console using forEach() sortedCustomerListWithNullLast.stream().forEach(System.out::println); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
Before Sorting: Customer list :- nullCustomer [custName=Sneha, custCity=Pune, custAge=73]Customer [custName=Simran, custCity=Bangalore, custAge=37]Customer [custName=Nayanthara, custCity=Hyderabad, custAge=52]Customer [custName=Shalini, custCity=Chennai, custAge=70]nullCustomer [custName=Abirami, custCity=Bangalore, custAge=48]Customer [custName=Trisha, custCity=Mangalore, custAge=45]nullSorted Customer list on Name with NULL values First :- nullnullnullCustomer [custName=Abirami, custCity=Bangalore, custAge=48]Customer [custName=Nayanthara, custCity=Hyderabad, custAge=52]Customer [custName=Shalini, custCity=Chennai, custAge=70]Customer [custName=Simran, custCity=Bangalore, custAge=37]Customer [custName=Sneha, custCity=Pune, custAge=73]Customer [custName=Trisha, custCity=Mangalore, custAge=45]Sorted Customer list on Name with NULL values Last :- Customer [custName=Abirami, custCity=Bangalore, custAge=48]Customer [custName=Nayanthara, custCity=Hyderabad, custAge=52]Customer [custName=Shalini, custCity=Chennai, custAge=70]Customer [custName=Simran, custCity=Bangalore, custAge=37]Customer [custName=Sneha, custCity=Pune, custAge=73]Customer [custName=Trisha, custCity=Mangalore, custAge=45]nullnullnull |
6. Java 8 – 过滤掉空值并对字符串元素进行排序:
- 首先使用Stream的filter()方法从字符串列表中删除空值
- 从列表中过滤掉空值后,我们可以通过将Comparator传递给Stream的Sorted()方法来对列表中存在的其余String 元素进行排序
- 使用Comparator.naturalOrder()方法进行升序(或字母顺序)
- 使用Comparator.reverseOrder()方法按反向字母顺序对 String 元素进行排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Comparator;import java.util.List;public class FilterAndThenSortUsingJava8 { public static void main(String[] args) { // string list List<String> names = Arrays.asList( null, "Kimi", "Michael", null, "Alonso", "Narain", null ); // printing original names list System.out.println("Unsorted names list with NULL values :- \n"); names.forEach(System.out::println); // remove null values using filter() and then sorted() System.out.println("\n\nSorted names list " + "after filtering out NULL values :- \n"); names // original data source .stream() // sequential stream .filter(str -> null != str) // filter() .sorted(Comparator.naturalOrder()) //sorted() .forEach(System.out::println); // forEach() }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
Unsorted names list with NULL values :- nullKimiMichaelnullAlonsoNarainnullSorted names list after filtering out NULL values :- AlonsoKimiMichaelNarain |
7. Collections.sort()方法:
- 该方法需要2 个参数,即;第一个是要排序的实际列表,第二个是比较器
- 由于我们尝试对存在null 值的列表进行排序,因此我们可以使用nullsFirst()或nullsLast()静态方法分别将null值推送到开始/结束位置
- 此外,我们必须将另一个Comparator作为参数传递给nullFirst/nullsLast静态方法,以便按升序/降序对其余非空值进行排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Java8SortingUsingCollectionsSortMethod { public static void main(String[] args) { // 1. string list List<String> names = Arrays.asList( null, "Kimi", "Michael", null, "Alonso", "Narain", null ); // 1.1 printing original names list System.out.println("Unsorted names list with NULL values :- \n"); names.forEach(System.out::println); // 2.1 Sorting using Collections.sort() with null values first Collections.sort(names, Comparator .nullsFirst(Comparator.naturalOrder())); // 2.2 nullsFirst -> print to console System.out.println("\n\nCollections.sort() with NULL values First:- \n"); names.forEach(System.out::println); // 3.1 Sorting using Collections.sort() with null values first Collections.sort(names, Comparator .nullsLast(Comparator.naturalOrder())); // 3.2 nullsLast -> print to console System.out.println("\n\nCollections.sort() with NULL values Last:- \n"); names.forEach(System.out::println); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
Unsorted names list with NULL values :- nullKimiMichaelnullAlonsoNarainnullCollections.sort() with NULL values First:- nullnullnullAlonsoKimiMichaelNarainCollections.sort() with NULL values Last:- AlonsoKimiMichaelNarainnullnullnull |
8.Arrays.sort()方法:
- 这也与Collections.sort()方法非常相似,除了第一个参数是数组
- 该方法需要2 个参数,即;第一个是要排序的实际数组,第二个是比较器
- 由于我们尝试对存在null 值的数组进行排序,因此我们可以使用nullsFirst()或nullsLast()静态方法分别将null值推送到起始/最后位置
- 此外,我们必须将另一个Comparator作为参数传递给nullFirst/nullsLast方法,以便按升序/降序对其余非空值进行排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package net.bench.resources.stream.sorting.nullvalues;import java.util.Arrays;import java.util.Comparator;public class Java8SortingUsingArraysSortMethod { public static void main(String[] args) { // 1. string list String[] names = { null, "Kimi", "Michael", null, "Alonso", "Narain", null }; // 1.1 printing original names list System.out.println("Unsorted names list with NULL values :- \n"); System.out.println(Arrays.toString(names)); // 2.1 Sorting using Arrays.sort() with null values first Arrays.sort(names, Comparator.nullsFirst(Comparator.naturalOrder())); // 2.2 nullsFirst -> print to console System.out.println("\n\nArrays.sort() with NULL values First:- \n"); System.out.println(Arrays.toString(names)); // 3.1 Sorting using Arrays.sort() with null values first Arrays.sort(names, Comparator.nullsLast(Comparator.naturalOrder())); // 3.2 nullsLast -> print to console System.out.println("\n\nArrays.sort() with NULL values Last:- \n"); System.out.println(Arrays.toString(names)); }} |
输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Unsorted names list with NULL values :- [null, Kimi, Michael, null, Alonso, Narain, null]Arrays.sort() with NULL values First:- [null, null, null, Alonso, Kimi, Michael, Narain]Arrays.sort() with NULL values Last:- [Alonso, Kimi, Michael, Narain, null, null, null] |
相关文章:
- Java 8 – 如何对 ArrayList 元素进行排序
- Java 8 – 原始、字符串和自定义对象的排序列表
- Java 8 – 使用 List 的 sort() 方法对 ArrayList 进行排序
- Java 8 – 如何对 LinkedList 元素进行排序
- Java 8 – 如何对 HashSet 元素进行排序
- Java 8 – 如何对 LinkedHashSet 元素进行排序
- Java 8 – 如何按降序对 TreeSet 进行排序
- Java 8 – 如何对存在空值的列表和数组进行排序
- Java 8 – 如何按升序和降序对数组进行排序?
- Java 8 – 对多个字段上的对象列表进行排序(3 级属性)
参考:
摘抄自网络,便于检索查找。

浙公网安备 33010602011771号