Шаг 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);

Как мы видим, преимущество лямбда-выражений на лицо.

На следующем шаге мы рассмотрим функциональные интерфейсы

Предыдущий шаг Содержание Следующий шаг