Шаг 112.
Язык программирования Java.
Лямбда-выражения
На этом шаге мы рассмотрим синтаксис лямбда-выражений
Ранее мы знакомили вас с функциями для работы с коллекциями. Одной из них была функция sort, которая может принимать вторым аргументом компаратор, который задает порядок сортировки. До выхода Java 8, любой программист Java вынужден был писать что-то подобное следующему фрагменту программы:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// Условие сортировки
return o2 - o1;
}
});
Если условие сортировки будет достаточно сложным, то такой код будет уже менее понятным. Да и писать каждый раз нечто подобное дело утомительное. В Java 8 были добавлены лямбда-выражения. Рассмотрим следующие примеры лямбда-выражений:
// 1
Runnable noArguments = () -> System.out.println("Hello world");
//2
ActionListener oneArgument = event -> System.out.println("button clicked");
//3
Runnable multiStatement = () -> {
System.out.print("Hello ");
System.out.println("world");
};
//4
BinaryOperator<Long> add = (x, y) -> x + y;
//5
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
Самое простое объявления лямбда-выражения приведено в первом примере. В нем объявлено лямбда-выражение без аргументов, которое выводит на экран надпись Hello world. Каждое лямбда-выражение состоит из 3 частей: перечисление аргументов (они перечисляются левее от стрелки в круглых скобках), стрелка и тело лямбда-выражения. Запустив приложение с таким фрагментом кода вы ничего не увидите на экране, потому что все данные выражения это на самом деле описание функций, которые нужно вызывать чтобы выполнить какие-то действия.
Также мы можем объявить лямбда-выражение с аргументами. Например, во втором примере приведено выражение с одним аргументом.
Если мы хотим, чтобы лямбда-выражение выполняло несколько действий, то программист должен объединить их в блок, выделив его фигурными скобками. В третьем примере приведено выражение с несколькими действиями.
Подобно обычным функциям, лямбда-выражения могут принимать несколько аргументов, что и приведено в четвертом примере.
Обратим внимание, что во втором и в четвертом примере мы опустили типы аргументов. Всё дело в том, что Java понимает какого типа должны быть данные аргументы из типа результата. В четвертом примере результат должен быть типа Long, поэтому типы аргументов будут типа Long. Несмотря на это, мы можем явно указать типы аргументов. Это приведено в пятом примере.
Зная теперь синтаксис лямбда-выражений можно переписать фрагмент сортировки списка следующим способом:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
Collections.sort(list, (o1, o2) -> o2 - o1);
Как мы видим, преимущество лямбда-выражений на лицо.
На следующем шаге мы рассмотрим функциональные интерфейсы
Предыдущий шаг
Содержание
Следующий шаг