Go to the home page  / Java  / Функциональное программирование  / Лямбда-выражения

Лямбда-выражения

Igor Lazarevsky, 2022.02.03 17:48

Лямбда-выражения доступны начиная с Java SE 8. Помогают очень сильно сократить код, сделать его красивым и лаконичным.

Очень полезны в библиотеке коллекций. Помогают лаконично перебирать, фильтровать и извлекать данные из коллекции.

Лямбда-выражение Java хоть и похоже на экземпляр анонимного класса, но технически все же рассматривается как функция, так как компилятор не создает файл .class.

Как легче всего понять синтаксис лямбды

  1. Вспомним, как мы раньше описывали метод, возьмем, например, такой, для примера
     public static void run(String name) {
         System.out.println(name + " is running...");
     }
  2. Но лямбда – это метод без класса, метод "который гуляет сам по себе". А значит слово static бессмысленно для него. Как и слова public или `private. Убираем лишнее и у нас остается...
     void run(String name) {
         System.out.println(name + " is running...");
     }
  3. Но лямбда – это еще и метод без имени! Поэтому убираем имя...
     void (String name) {
         System.out.println(name + " is running...");
     }
  4. Тип возвращаемого значения или void можно вывести автоматически, глядя на код метода, поэтому убираем void
     (String name) {
         System.out.println(name + " is running...");
     }
  5. И последним шагом добавим спец. символ – стрелку. Ее специально придумали, чтобы отличать лямбды от обычных методов. Ну и наглядно, вроде как. Стрелка показывает, что на входе у нас есть какие-то параметры и они, как бы по стрелке передаются в тело метода. Вуаля
     (String name) -> {
         System.out.println(name + " is running...");
     }
    Вот мы и написали полноценную лямбду.

Общая структура Лямбда-выражений

(список аргументов) -> {тело}

Лямбда-выражение Java состоит из трех компонентов.

  1. Список аргументов. Может быть пустым или непустым.

  2. Стрелка. Просто условное обозначение

  3. Тело. Содержит выражения и операторы для лямбда-выражения. Может быть в фигурных скобках или без них

(Список аргументов)
Знак стрелки
{ Команды }

Пример

Запуск нового потока по старому, без лямбды

Thread t1 = new Thread(new Runnable() {
    public void run() {
        System.out.println("Thread1 is running...");
    }
});
t1.start();

Теперь заменим все это длинное выражение, которое передается в параметрах в new Thread() на что-то более короткое

new Runnable() {
    public void run() {
        System.out.println("Thread1 is running...");
    }
};

Ведь, по большому счету, нам для запуска потока не нужно ни имя Runnable, ни название метода run, нужно просто передать набор команд, которые должны выполниться в новом потоке.

{
    System.out.println("Thread1 is running...");
};

Мы просто добавим к этому коду

() -> 

И в виде лямбды в итоге будет выглядеть так:

() -> {
    System.out.println("Thread1 is running...");
};

И в итоге, запуск потока с лямбдой выглядит очень лаконично:

Thread t2 = new Thread(() -> {
    System.out.println("Thread2 is running...");
});
t2.start();
Igor Lazarevsky, 2022.02.03 17:53