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

Что было добавлено в Java 8? Лямбда-выражения

Изображение обложки Исванто Арифа на Unsplash С этой статьи я начинаю короткую серию, в которой объясню… Помеченный как java, начинающий, функциональный.

Изображение на обложке Исванто Ариф на Расплескать

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

Эти серии будут разделены на три части (ссылки будут обновляться после публикации каждого сообщения в блоге).:

  • Часть 1 . Лямбда-выражение (это одно)

  • Часть 2. Потоки (скоро)

  • Часть 3. Необязательно (скоро)

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

Когда вы начинаете изучать Java и уже прошли примеры командной строки, вы, вероятно, захотите создать настольное приложение. И для этого вы, вероятно, используете библиотеку JavaFX (по крайней мере, это был мой случай).

В большинстве приложений JavaFX нам необходимо обрабатывать события, которые могут быть вызваны пользователями. Например, когда они нажимают кнопку, создается объект события, который необходимо обработать.

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

button.setOnAction(new EventHandler() {
       @Override
       public void handle(ActionEvent e) {
           System.out.println("Button clicked");
       }
});

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

button.setOnAction( (e) -> System.out.println("Button clicked") );

Ого! Это коротко, но что там происходит?

Синтаксис лямбда-выражения состоит из трех частей. Первый – это скобки, (e) , которые содержат (или нет) параметры абстрактного метода анонимного внутреннего класса . Действительно важно помнить, что лямбды можно использовать только при использовании одного абстрактного метода .

В нашем случае Событие действия объект представлен e ссылка. Если у метода нет какого-либо параметра, мы можем вместо этого использовать простой () , например, для Доступный для запуска интерфейс.

Runnable r1 = () -> System.out.println("I'm in outside main thread!");

Наконец, метод может иметь более одного аргумента, например Компаратор метод интерфейса сравнение .

Comparator userComperator = 
(User first, User second) ->  first.email().compareTo(second.email());

В приведенном выше примере мы также могли бы не включать типы аргументов (User), но по соображениям ясности их следует добавить.

Далее, после аргументов, появляется вновь введенный оператор со стрелкой вправо -> .

И, наконец, есть тело реализованного метода. Обычно это одна строка кода, но если нам потребуется больше, мы можем окружить ее {} скобки.

button.setOnAction( (e) ->  {
  System.out.println("Button clicked");
  label.setText("Clicked");
});

Если метод должен возвращать значение, мы можем использовать оператор return , как в обычных методах

Ссылка на метод (::)

Еще одна тема, которая тесно связана и была представлена вместе с лямбда-выражением, – это ссылка на метод. Короче говоря, с помощью нового оператора :: мы можем назначить метод ссылке, точно так же, как объекту или примитивному типу. Такой подход позволяет нам извлечь метод из объекта и передать его в другое место, не выполняя их.

Object objectInstance = new Object();
IntSupplier equalsMethodOnObject = objectInstance::hashCode;
System.out.println(equalsMethodOnObject.getAsInt());

Выше мы назначаем Хэш-код методу ссылки Поставщик . Затем его можно передать туда, куда мы захотим в коде.

С помощью ссылки на метод мы также можем назначать статические методы (без создания экземпляра класса) или конструктор.

Рекомендации

Оригинал: “https://dev.to/wkrzywiec/what-was-added-to-java-8-lambda-expressions-459j”