Здравствуйте, друзья, это моя первая статья о Java 8 .
Сегодня я расскажу, как лямбда-выражения и ссылки на методы сокращают шаблонный код и делают наш код более читабельным и компактным. Предположим, у нас есть Student
класс с двумя полями, name
и age
. Мы собираемся отсортировать список студентов с помощью Comparator
интерфейса. После этого мы будем постепенно сокращать код с помощью некоторых новых функций Java 8.
Это наш Student
класс с двумя полями и методами получения и установки. Мы переопределяем toString
метод Object
класса.
Джава
xxxxxxxxxx
1
class Student {
2
3
private String name;
4
private Integer age;
5
6
Student(String name, int age) {
7
this.name = name;
8
this.age = age;
9
}
10
11
public String getName() {
12
return name;
13
}
14
15
public void setName(String name) {
16
this.name = name;
17
}
18
19
public Integer getAge() {
20
return age;
21
}
22
23
public void setAge(Integer age) {
24
this.age = age;
25
}
26
27
28
public String toString() {
29
return "Student [name=" + name + ", age=" + age + "]";
30
}
31
}
Предположим, у нас есть, studentlist
что мы будем сортировать. Мы знаем, что List
предоставляет sort
метод и signature
как:
Джава
xxxxxxxxxx
1
void sort(Comparator<? super E> c)
Он ожидает, что Comparator
объект в качестве аргумента для сравнения двух Students
!
Вам также может понравиться: Шаблоны функционального программирования с Java 8 .
Шаг 1. Создание пользовательского StudentComparator для передачи в метод сортировки
Решение выглядит так:
Джава
xxxxxxxxxx
1
public class StudentComparator implements Comparator<Student> {
2
3
public int compare(Student s1, Student s2){
4
return s1.getAge().compareTo(s2.getAge());
5
}
6
}
7
8
studentlist.sort(new StudentComparator());
Шаг 2: Используйте анонимный класс
Вместо того, чтобы реализовывать его Comparator
с целью его создания один раз, мы могли бы использовать анонимный класс для улучшения нашего решения. Решение выглядит так:
Джава
xxxxxxxxxx
1
studentlist.sort(new Comparator<Student>(){
2
public int compare(Student s1, Student s2){
3
return s1.getAge().compareTo(s2.getAge());
4
}
5
});
Шаг 3: Используйте лямбда-выражения
Наше текущее решение все еще многословно. Java 8 представляет лямбда-выражения, которые обеспечивают легкий синтаксис для достижения той же цели.
Мы знаем, что лямбда-выражение можно использовать там, где ожидается функциональный интерфейс: функциональный интерфейс — это интерфейс, определяющий только один абстрактный метод.
Сигнатура абстрактного метода (называемого дескриптором функции ) может описывать сигнатуру лямбда-выражения . В нашем случае, Comparator
представляет дескриптор функции (T, T) -> int
.
Поскольку мы используем Student
, это представляет более конкретно (Student, Student) -> int
. Наше улучшенное решение выглядит следующим образом:
Джава
xxxxxxxxxx
1
studentlist.sort((Student std1, Student std2) -> std1.getAge().compareTo(std2.getAge()));
Мы можем написать наше решение так:
Джава
xxxxxxxxxx
1
studentlist.sort((std1, std2) -> std1.getAge().compareTo(std2.getAge()));
Компилятор Java может определить типы параметров лямбда-выражения, используя контекст, в котором появляется лямбда-выражение . Таким образом, мы можем избежать использования типов параметров.
Можем ли мы сделать наш код еще более читабельным? Да, Comparator
есть статический вспомогательный метод comparing
, который Comparable
вызывает функцию, которая извлекает ключ и создает Comparator
объект.
Теперь мы можем переписать наше решение в несколько более компактной форме:
Джава
xxxxxxxxxx
1
import static java.util.Comparator.comparing;
2
3
studentlist.sort(comparing((std) -> std.getAge()));
Шаг 4. Использование ссылок на метод
Мы можем использовать ссылку на метод, чтобы сделать наш код немного менее подробным:
Джава
xxxxxxxxxx
1
static import of java.util.Comparator.comparing
2
3
studentlist.sort(comparing(Student::getAge));
Поздравляем, это наше окончательное решение!
Это короче; также очевидно, что означает «сортировать ученика, сравнивая возраст ученика». Вот как Java 8 делает код более читабельным и компактным.
Если у вас есть какие-либо сомнения, не стесняйтесь спрашивать меня в разделе комментариев ниже. Хорошего дня.
Ссылка: Java 8 в действии .