Привет друзья,
В этом уроке мы увидим, как мы можем отсортировать список элементов, когда немногие из элементов являются нулевыми в списке, используя Java 8 Comparator.nullsFirst, так что нулевые значения обрабатываются как наименьшие элементы в списке.
— Что такое компаратор
Метод nullsFirst делает в компараторе
— Сортировка списка строк, имеющих ненулевые имена
— Сортировка списка строк с именами и нулями без использования nullsFirst
— Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
— сортировка списка пользовательских объектов без нуля
— Сортировка списка пользовательских объектов с нулями без использования nullsFirst
— Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
— Сортировка списка с сотрудником с именем, равным нулю

Что такое компаратор?
Компаратор — это FunctionalInterface, который имеет следующий абстрактный метод
int сравнивать (T
о1, т
о2);
Так что если вы хотите отсортировать, скажем, ваш список. Вы можете создать класс, реализующий метод сравнения интерфейса Comparator, в котором вы можете определить логику сортировки и передать этот компаратор в метод list.sort (), и он будет сортироваться в соответствии с вашим определенная логика.
В качестве альтернативы, вместо создания отдельного класса, реализующего интерфейс Comparator, вы можете передать лямбда-функцию (реализующую метод сравнения Comparator) в метод list.sort ().
Что делает метод nullsFirst в Comparator?
В Java 8 было добавлено множество стандартных и статических методов в интерфейсе Comparator.
nullsFirst — это один из статических методов, определенных в интерфейсе Comparator, имеющий следующую подпись:
общественности
статический <T> Comparator <T> nullsFirst (Comparator <?
супер T>
компаратор)
Так что же это делает?
Возвращает дружественный к нулю компаратор, который считает, что ноль меньше чем ноль.
— Когда оба объекта равны нулю, они считаются равными.
— Если оба значения не равны NULL, указанный компаратор, который передается методу nullsFirst в качестве параметра, используется для определения порядка сортировки.
— Когда указанный компаратор равен нулю, возвращенный компаратор считает все ненулевые значения равными.
Чтобы понять использование nullsFirst, давайте попробуем отсортировать список строк, имеющих имена сотрудников,
— сначала без нулевых значений
— затем с нулевыми значениями, но без nullsFirst
— затем с нулевыми значениями и с нулевыми значениями
— Затем мы сделаем те же самые шаги для пользовательского объекта Employee.
— И тогда мы увидим, что если в пользовательском объекте одно из свойств, на основе которого должна быть выполнена сортировка, является нулевым
Сортировка списка строк с ненулевыми именами
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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); } |
|
1
|
} |
Вот вывод:
Перед сортировкой:
Gaurav
Тендулкар
Суреш
Рохит
Bumrah
После сортировки:
Bumrah
Gaurav
Рохит
Суреш
Тендулкар
Сортировка списка строк с именами и нулями без использования nullsFirst
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
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); } |
|
1
|
} |
Вот вывод:
Перед сортировкой:
Gaurav
ноль
Сэчин
Суреш
ноль
Рохит
Jasprit
ноль
Исключение в теме «главная»
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 пытается сравнить два объекта, вызывая CompareTo для одного из объектов, мы получаем NullPointerException.
Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
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); } |
|
1
|
} |
Вот вывод:
Перед сортировкой:
Gaurav
ноль
Тендулкар
Суреш
ноль
Рохит
Jasprit
ноль
После сортировки:
ноль
ноль
ноль
Gaurav
Jasprit
Рохит
Суреш
Тендулкар
Сортировка списка пользовательских объектов без нуля
Мы создадим класс Employee, который будет простым POJO, как показано ниже:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
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; |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
} public String getName() { return name; } public String getDepartment() { return department; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]"; }} |
И вот наш тестовый класс:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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); |
|
1
|
} |
Вот вывод:
Перед сортировкой:
Сотрудник [id = 1, имя = Гаурав, отдел = IT]
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Сотрудник [id = 1, имя = Суреш, отдел = IT]
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Bumrah, отдел = Admin]
После сортировки:
Сотрудник [id = 1, имя = Bumrah, отдел = Admin]
Сотрудник [id = 1, имя = Гаурав, отдел = IT]
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Суреш, отдел = IT]
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Сортировка списка пользовательских объектов с нулями без использования nullsFirst
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
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"), |
|
1
2
3
4
5
6
7
|
null, new Employee(1, "Rohit", "Admin"), new Employee(1, "Bumrah", "Admin"), null); employees.sort(Comparator.comparing(Employee::getName)); employees.forEach(System.out::println); |
|
1
|
} |
|
1
|
} |
Вот вывод:
Перед сортировкой:
Сотрудник [id = 1, имя = Гаурав, отдел = IT]
ноль
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Сотрудник [id = 1, имя = Суреш, отдел = IT]
ноль
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Bumrah, отдел = Admin]
ноль
Исключение в теме «главная»
java.lang.NullPointerException
в java.base / java.util.Comparator.lambda $, сравнивая $ 77a9974f $ 1 (
Comparator.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)
at com.blogspot.javasolutionsguide.ComparatorTestWithListOfEmployeesWithNulls.main (ComparatorTestWithListOfEmployeesWithNulls.java:19)
Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
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"), |
|
1
2
3
4
5
6
7
8
|
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, отдел = Admin]
Сотрудник [id = 1, имя = Гаурав, отдел = IT]
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Суреш, отдел = IT]
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Сортировка списка с сотрудником с именем, равным нулю
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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, имя = Гаурав, отдел = IT]
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Сотрудник [id = 1, name = null, отдел = IT]
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Bumrah, отдел = Admin]
После сортировки:
Сотрудник [id = 1, name = null, отдел = IT]
Сотрудник [id = 1, имя = Bumrah, отдел = Admin]
Сотрудник [id = 1, имя = Гаурав, отдел = IT]
Сотрудник [id = 1, имя = Rohit, отдел = Admin]
Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]
Резюме
Когда у нас есть список элементов, в которых несколько элементов являются нулевыми, и мы хотим, чтобы эти нулевые значения рассматривались как наименьшие элементы в списке, мы можем использовать метод nullsFirst интерфейса Comparator, который выполняет следующие действия:
Возвращает дружественный к нулю компаратор, который считает, что ноль меньше чем ноль.
— Когда оба объекта равны нулю, они считаются равными.
— Если оба значения не равны NULL, указанный компаратор, который передается методу nullsFirst в качестве параметра, используется для определения порядка сортировки.
— Когда указанный компаратор равен нулю, возвращенный компаратор считает все ненулевые значения равными.
Спасибо за чтение. Если вам понравился пост, вы можете поделиться им и можете подписаться на этот блог для более таких сообщений.
|
Опубликовано на Java Code Geeks с разрешения Гаурава Бхардваджа, партнера нашей программы JCG . См. Оригинальную статью здесь: Сортировка списка с нулевыми значениями с помощью nullsFirst в Comparator. Мнения, высказанные участниками Java Code Geeks, являются их собственными. |