Что такое Lambda

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

Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая, собственно, представляет тело лямбда-выражения, где выполняются все действия.

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

interface Operationable {
    int calculate(int x, int y);
}

public static void main(String[] args) {
    Operationable operation = (x, y) -> x + y;     
    int result = operation.calculate(10, 20);
    System.out.println(result); //30
}

По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.

  • Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.

  • Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:

    operation = (int x, int y) -> x + y;
    //При написании самого лямбда-выражения тип параметров разрешается не указывать:
    (x, y) -> x + y;
    //Если метод не принимает никаких параметров, то пишутся пустые скобки, например,
    () -> 30 + 20;
    //Если метод принимает только один параметр, то скобки можно опустить:
    n -> n * n;
  • Конечные лямбда-выражения не обязаны возвращать какое-либо значение.
    interface Printable {
        void print(String s);
    }
     
    public static void main(String[] args) {
        Printable printer = s -> System.out.println(s);
        printer.print("Hello, world");
    }

     

  • Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции ifswitch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:
    Operationable operation = (int x, int y) -> {       
        if (y == 0) {
            return 0;
        }
        else {
            return x / y;
        }
    };

     

  • Передача лямбда-выражения в качестве параметра метода:
    interface Condition {
        boolean isAppropriate(int n);
    }
    
    private static int sum(int[] numbers, Condition condition) {
        int result = 0;
        for (int i : numbers) {
            if (condition.isAppropriate(i)) {
                result += i;
            }
        }
        return result;
    }
    
    public static void main(String[] args) {
        System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
    } 

     

Oct. 21, 2023, Источник

Lambda-выражения — это способ предоставления четкой и компактной формы для представления экземпляра функционального интерфейса. Функциональный интерфейс, напомню, это интерфейс с одним абстрактным методом. Эти выражения позволяют вам выполнять функциональное программирование, упрощая создание анонимных классов и делая код более читаемым и лаконичным.

Данное выражение состоит из списка параметров, символа стрелки `->` и тела выражения. Тело может быть выражением или блоком кода. Если тело выражения состоит из одного выражения, фигурные скобки необязательны, и значение выражения автоматически возвращается. Если тело содержит блок кода, он должен быть заключен в фигурные скобки, и вам может потребоваться использовать `return` для возврата значения (если метод не `void`).

Пример его использования:

List<String> names = Arrays.asList("John", "Jane", "Doe", "Sarah");

// Сортировка списка строк по длине с использованием lambda-выражения
Collections.sort(names, (String a, String b) -> a.length() - b.length());

names.forEach(name -> System.out.println(name));

В этом примере мы сначала сортируем список имен по длине с помощью такого выражения, переданного в метод `Collections.sort()`. Затем мы используем еще одно lambda-выражение с методом `forEach` для вывода всех имен в списке. Это показывает, как они могут сделать код более выразительным и избавить от необходимости явного создания анонимных классов для реализации интерфейсов с одним методом.

Lambda-выражения особенно полезны при работе с коллекциями и API потоков (Streams API), позволяя выполнять операции фильтрации, сортировки, преобразования и агрегирования коллекций данных с минимальным синтаксисом и усилиями.

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

Feb. 22, 2024, easyoffer