Статьи

Сколько строк кода вы написали, чтобы отсортировать коллекцию объектов до Java 8?

Сколько строк кода вы написали, чтобы отсортировать коллекцию объектов до 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, являются их собственными.