Сколько строк кода вы написали, чтобы отсортировать коллекцию объектов до Java 8? Сколько вам понадобится с Java 8?
Вы можете сделать это с помощью одной строки в Java 8.
Давайте посмотрим на следующий класс Employee.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class Employee { private String name; private Integer age; public Employee(String name, Integer age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }} |
Используя метод Collection (), можно отсортировать список сотрудников. Метод sort () ожидает Comparator в качестве аргумента для сравнения двух объектов Employee. Итак, наше первое решение выглядит следующим образом.
|
1
2
3
4
5
6
7
8
|
public class EmployeeComparotor implements Comparator { @Override public int compare(Employee e1, Employee e2) { return e1.getAge().compareTo(e2.getAge()); }}employeeList.sort(new EmployeeComparotor()); |
Вместо реализации Comparator и создания его нового экземпляра мы можем использовать анонимный класс для улучшения нашей программы.
|
1
2
3
4
5
6
|
employeeList.sort(new Comparator() { @Override public int compare(Employee e1, Employee e2) { return e1.getAge().compareTo(e2.getAge()); }}); |
Теперь давайте посмотрим, как мы можем улучшить этот код, чтобы уменьшить многословность с помощью функций Java 8. Java 8 представляет лямбда-выражения, которые позволяют нам передавать код методу. Лямбда-выражение может быть передано методу, где ожидается функциональный интерфейс. Функциональный интерфейс — это интерфейс, определяющий только один абстрактный метод. В Java 8 Comparator является функциональным интерфейсом. Метод sort () коллекции ожидает в качестве аргумента Comparator, который принимает функциональный интерфейс. В этом случае Comparator представляет дескриптор BiFunction. BiFunction — это функциональный интерфейс в Java 8. Итак, вы можете передать лямбда-выражение в метод sort следующим образом. Для того, чтобы отсортировать список сотрудников по возрасту, вам понадобится одна строка:
|
1
|
employeeList.sort((Employee e1, Employee e2) -> e1.getAge().compareTo(e2.getAge())); |
Компилятор Java может определить типы параметров лямбда-выражения, используя контекст, в котором появляется лямбда-выражение. Таким образом, вы можете удалить типы параметров и переписать код следующим образом.
|
1
|
employeeList.sort((e1, e2) -> e1.getAge().compareTo(e2.getAge())); |
Попробуем еще больше сократить код. Java 8 Comparator имеет статический метод, называемый comparing (), который принимает функцию в качестве аргумента. Эта функция должна извлечь ключ сортировки и создать объект Comparator. Таким образом, самый короткий код для сортировки списка объектов в Java 8 будет,
|
1
|
employeeList.sort(comparing((e) -> e1.getAge())); |
Вместо использования лямбда-выражения мы можем использовать ссылки на методы, чтобы сделать наш код немного менее многословным.
|
1
|
employeeList.sort(comparing(Employee::getAge)); |
Если вы хотите отсортировать список сотрудников по возрастанию в порядке убывания, вы можете использовать метод интерфейса по умолчанию в обратном порядке ().
|
1
|
employeeList.sort(comparing(Employee::getAge).reversed()); |
Теперь, давайте посмотрим, вы хотите отсортировать сотрудников по их возрасту, а затем по возрасту сотрудников по именам. Напомню, как вы делали эту раннюю версию Java. В Java 8 вы можете просто использовать метод thenComparing () для этого.
|
1
|
employeeList.sort(comparing(Employee::getAge).thenComparing(Employee::getName)); |
| Опубликовано на Java Code Geeks с разрешения Семики Калуге, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Сколько строк кода вы написали, чтобы отсортировать коллекцию объектов до Java 8?
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |