Лямбда-выражения в Java [дубликат]

168
05 октября 2018, 01:40

На данный вопрос уже ответили:

  • Как использовать лямбда-выражения в Java 8? 2 ответа

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

Answer 1

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

Собственно, лямбда-выражения созданы в первую очередь, чтобы упростить написание кода. А сами по себе - они очень схожи с анонимными классами.

Думаю, проще будет понять по примеру. Допустим, Вы хотите создать и запустить новый поток. Вы можете сделать это несколькими способами:

  • Создать класс, имплементрирующий функциональный интерфейс Runnable и добавить экземпляр оного в параметры Thread'а
  • Создать анонимный класс непосредственно внутри параметров конструктора Thread'а
  • Использовать это самое ноу-хау и написать всё через лямбды

Первое:

class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello world from new thread");
    }
}
  ...
  ...
 Thread thread = new Thread(new RunnableImpl()); // Обычное использование объекта класса 

Второе:

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // Анонимный класс упрощает код и добавляет функциональность
                System.out.println("Hello world from new thread");
            }
        });

Третье:

Thread thread = new Thread(() -> System.out.println("Hello world from new thread via lambda")); // Как видим, тут очень всё просто

Затем, для каждого из данных примеров вызываем thread.start(); и наслаждаемся результатом.

Как видно из 3-его примера, в основе лямбд лежит особый синтаксис (вот это непонятное () ->). Для того чтобы понять это, вначале нужно вообще осознать, в каких случаях используются лямбды, вернее, где это допустимо синтаксисом языка. Я подчеркнул одно важное слово - функциональный интерфейс, именно на основе этого и работают лямбды. Функциональный интерфейс - это такой интерфейс, у которого всего один метод (как у Runnable только один метод run). Можно написать свой собственный функциональный интерфейс. Вот:

interface CalculateEngine {
    double add(double a, double b);
}

И затем, воспользоваться лямбдами

 CalculateEngine calculateEngine = ((a, b) -> a + b);
 System.out.println(calculateEngine.add(4.5, 3.2)); // 7.7

Аналогично можно провернуть это через анонимные классы (чтобы лучше понять, что да как)

CalculateEngine calculateEngine = new CalculateEngine() {
    @Override
    public double add(double a, double b) {
        return a + b;
    }
};
System.out.println(calculateEngine.add(4.5, 3.2)); // 7.7

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

P.S: Ещё, хотел бы Вам сказать, что подобные вещи лучше читать в разных книгах/статьях и etc. Так-же, похожие вопросы уже задавали. Очень важно уметь гуглить.

READ ALSO
Где view из mvc в андроид приложении. Document-view. МVP.

Где view из mvc в андроид приложении. Document-view. МVP.

Возьмем просто андроид приложение : класс наследующий Activity в этом классе подключается layout и подписываемся на события от кнопокИ по определенному...

170
Как передать параметры в перечисление Cell

Как передать параметры в перечисление Cell

Есть метод, который описывает движение фигуры Слон на шахматной доскеПоследний Cell подсвечивается красным с ошибкой "Cell(int, int)' has private access in 'ru

166
Селектор для двух классов на одном узле

Селектор для двух классов на одном узле

Допустим у нас есть классыred и

140