Рубрики
Без рубрики

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

Лямбда-выражение Java, Лямбда-выражение Java, Лямбда-выражения Java 8, учебник по лямбда-выражению java, пример лямбда-выражения java, лямбда-функция java, Лямбда-выражение на Java.

Автор оригинала: Pankaj Kumar.

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

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

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

  • Анонимный : Мы можем сказать анонимный, потому что у него нет явного имени, как обычно у метода. Так что писать и думать об этом определенно меньше.
  • Функция : Ее можно рассматривать как функцию, потому что лямбда-выражение не связано с определенным классом, как метод. Но, как и метод, лямбда-код содержит список параметров, тело, тип возвращаемого значения и возможный список исключений, которые могут быть вызваны.
  • Передано : Лямбда-выражение может быть передано в качестве аргумента методу или сохранено в переменной.
  • Краткий : Нам не нужно писать много шаблонных шаблонов, как мы делаем для анонимных классов.

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

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

Пример, безусловно, поможет получить четкое представление. Рассмотрим Яблоко класс:

public class Apple {
    String color;
    Double weight;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }
}

Если мы хотим написать пользовательский компаратор для сравнения яблок по весу, до Java 7 мы писали его следующим образом:

Comparator byWeight = new Comparator() {
    public int compare(Apple a1, Apple a2){
        return a1.getWeight().compareTo(a2.getWeight());
    }
};

Теперь, используя лямбда-выражение, мы можем написать то же самое, что:

Comparator byWeight 
  = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

Объяснение Лямбда-выражения Java

Давайте углубимся в отдельные фрагменты этого выражения:

  • Список параметров : В этом случае он отражает параметры метода сравнения Компаратора – двух объектов Apple.
  • Стрелка : Стрелка -> отделяет список параметров от тела лямбды.
  • Тело лямбды : Сравните два яблока, используя их вес. Выражение считается возвращаемым значением лямбды.

Использование лямбда-выражения Java 8

Давайте рассмотрим некоторые примеры использования лямбда-выражения java.

  1. Логическое выражение : (Список списка) -> list.isEmpty()
  2. Создание объектов : () -> новое яблоко()
  3. Потребление из объекта : (Применить a) -> { System.out.println(a.получить вес()); }
  4. Выберите/извлечь из объекта : (Строка s) -> s.длина()
  5. Создайте одно значение, выполнив вычисление двух значений : (int a, int b) -> a * b
  6. Сравните два объекта : (Яблоко a1, Яблоко a2) -> a1.getWeight().compareTo(a2.getWeight())

Функциональные интерфейсы Java

Очевидно, возникает вопрос, где разрешены такие выражения? Ранее мы видели лямбда-выражение, заменяющее реализацию компаратора. мы также можем использовать его следующим образом:

List greenApples 
  = listOfApples.stream().filter(a -> a.getColor().equals("Green"))
      .collect(Collectors.toList());

Здесь метод filter() ожидает Предикат . Мы просто передали лямбду вместо требуемого интерфейса.

В принципе, мы можем использовать их в контексте функциональных интерфейсов . Итак, что же такое Функциональные интерфейсы?

В двух словах, Функциональный интерфейс-это интерфейс, который определяет ровно один абстрактный метод.

Некоторыми известными функциональными интерфейсами в Java являются Компаратор , Запускаемый , Список действий , Вызываемый и т. Д.

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

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

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

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

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

Давайте рассмотрим пример запускаемого . Рассмотрим процесс метод, который принимает Выполняемый экземпляр:

public class RunnableDemo {
    public static void process(Runnable r){
        r.run();
    }
}

Без использования Лямбды мы можем реализовать его как:

Runnable runnableWithAnonymousClass = new Runnable() {
    @Override
    public void run() {
        System.out.println("I am inside anonymous class implementation.");
    }
};
process(runnableWithAnonymousClass);

Использование лямбда – выражения:

Runnable runnableWithLambda = () -> System.out.println("I am inside Lmabda Expression.");
process(runnableWithLambda);

Кроме того, в тех случаях, когда мы используем эту выполняемую реализацию только один раз, мы также можем предоставить ее непосредственно при вызове метода process:

process(() -> System.out.println("I am inside Lambda Expression."));

Дескриптор функции

Важная вещь, которую необходимо понимать при работе с лямбда-выражением, – это функциональный дескриптор. Сигнатура абстрактного метода функционального интерфейса по существу описывает сигнатуру лямбда – выражения. Мы называем этот абстрактный метод дескриптором функции.

Например, выполняемый интерфейс можно рассматривать как подпись функции , которая ничего не принимает и ничего не возвращает (void), поскольку у нее есть только один абстрактный метод с именем run , который ничего не принимает и ничего не возвращает (void).

Это все для лямбда-выражений Java.

Ссылка: API Doc