Создание Лямбда-Функции было главной новостью Java 8 , выпущенный в 2014 ! Сегодня является практически обязательным знать, как они работают, и узнать их использовать в коде.
Предпочитает этот видео? Смотреть здесь!
Java 8 функциональное программирование
В течение некоторого времени в JavaScript пришли, если установление таких как язык по умолчанию развития front-end . Ao mesmo tempo scorre também o aparecimento ea популяризация языков como Scala, Kotlin и Python. У этих движений, функциональное программирование, начал становиться все более популярным.
С намерением принести эта возможность также для Java, был создан новый синтаксис лямбда-функции . Если вы никогда не видели, вот:
() -> System.out.println("Hello World")
Если вы никогда не видели код, так что, не пугайтесь, вы сможете легко понять что это значит.
Java без лямбда-функции
Если вы Java-программы в течение некоторого времени, вероятно, уже приходилось писать какой-то код вроде этого:
public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("Hello World"); } }).run(); }
Несмотря на то, что этот код работает отлично, он имеет большую проблему: гигант . Хорошо подумайте, были необходимы 6 строк кода, чтобы создать Поток и печать “Hello World”, то, что должно быть довольно тривиальным. Теперь, посмотрите, это же кода с помощью лямбда-функции:
public static void main(String[] args) { new Thread(() -> System.out.println("Hello World")).run(); }
Приведенный выше код интерпретируется компилятором точно так же, как предыдущий, с одной строки кода, и, будучи гораздо более кратким. И самое интересное здесь в том, что мы по-прежнему с помощью то же строитель для создания Поток
. Сама IDE, подтверждает это:
Конструктор получать экземпляр Runnable
Компилятор знает, что это лямбда-функция-это экземпляр Runnable
, даже если мы не прекратим это явный. Ок, но как он это знает?
Java 8 и концепции SAM
Esse comportamento do compilador fica simples quando entendemos o conceito de Единый абстрактный метод , или СБ . В принципе, любой интерфейс, который имеет один метод, следуя этой концепции. Вскоре, компилятор понимает, что ваша лямбда-функция-это, в самом деле, реализация этого одного метода. Давайте посмотрим внимательно.
Интерфейс Runnable
, например, имеет только метод run
. Вот он, скопирован прямо из JDK:
@FunctionalInterface public interface Runnable { public abstract void run(); }
Таким образом, при использовании лямбда-функции, как мы это делали выше, компилятор понимает, что она может быть реализации метода run
.
Что касается аннотации @FunctionalInterface
в этом классе, она только информационное . Она предписывает компилятору, которое управляет ошибка случае, если этот класс не выполните все требования, чтобы быть функциональный интерфейс , то есть, что может быть создано из лямбда-функции. Например, если этот интерфейс, бы два метода , произойдет ошибка компиляции. Несмотря на это, это заметки не является обязательным. Вы можете использовать лямбда-функции с любого интерфейса, который соответствует требования считать функциональным.
Итак, лямбда-функции, служат только для меня, чтобы уменьшить количество строк кода в таких случаях? Не . Правда, что лямбда-функции являются гораздо более полезный чем кажется. Примеры, которые я привела выше, только для понять его работы, но то, что они позволяют сделать в Java гораздо более интересное .
Функциональное программирование
С лямбда-функции, можно использовать методы, хорошо известные для тех, кто использует JavaScript , filter
, map
и forEach
.
Представьте себе, например , что у вас есть список чисел. Вы хотите напечатать значение из 7 первых, умножается на 2, а если число четное. Рассмотрим один из возможных вариантов реализации с Java традиционный:
public static void main(String[] args) { Listlista = Arrays.asList(1,5,8,7,4,6,3,2,1,8,5,7,4); for (int i = 0; i < 7; i++) { Integer numero = lista.get(i); if (numero % 2 == 0) { System.out.println(numero * 2); } } }
Это обычная реализация отлично работает, и, если вы программируете в Java некоторое время назад, вероятно, привыкли ее видеть. Однако, давайте посмотрим, как будет в той же реализации с использованием Streams жалость Java 8 :
public static void main(String[] args) { Listlista = Arrays.asList(1,5,8,7,4,6,3,2,1,8,5,7,4); lista.stream() .limit(7) .filter(e -> e % 2 == 0) .map(e -> e * 2) .forEach(System.out::println); }
Для тех, кто не привык, эта реализация может показаться странным на первый раз. Однако, она намного более сжатый и ограниченной . Можно узнать, точно все операции, которые делаются в этом списке. Очевидно, существует предел ( лимит
), фильтр ( filter
), преобразование ( map
) и действие для каждого элемента ( forEach
).
Это структура лямбда-функция, передаваемая в метод filter
:
Структура функции lambda прошлой метод filter
С moment, которые вы узнаете, лямбда-функции и новый интерфейс API Потоков, вы пишете много кода проще как понять, следовательно, более легким обслуживанием. Алем диссо, муито менос прописио а баги .
Реальное преимущество Java 8
Де-факто, принципиальное преимущество функций лямбды нет в Java 8 для разрешения использования де Потоков . Same lasseria практически невозможно использовать Потоки с легкостью. Код будет настолько большим и сложным, что просто не будет полезным. Если вам интересно, как это будет выглядеть выше реализации без использования лямбда-функции, вот. Пожалуйста, никогда не делайте этого.
public static void main(String[] args) { Listlista = Arrays.asList(1, 5, 8, 7, 4, 6, 3, 2, 1, 8, 5, 7, 4); Stream limit = lista.stream().limit(7); // nunca escreva um código assim! Stream filter = limit.filter(new Predicate () { @Override public boolean test(Integer e) { return e % 2 == 0; } }); Stream map = filter.map(new Function () { @Override public Integer apply(Integer e) { return e * 2; } }); map.forEach(new Consumer () { @Override public void accept(Integer t) { System.out.println(t); } }); }
Путь для будущего Java
Несмотря на то, что лямбда-функции были чрезвычайно полезны для запуска API Streams, это было только начало. Несколько Api становятся возможными с помощью функции lambda . O Java 9, por exemplo , trouse Реактивные потоки , o padrao implementado pela famosa biblioteka RxJava .
В описание вероятно, мы будем implement an многие вещи с функциональным программированием и функции лямбды узел Java , как запросы HTTP операций с файлов и связи базы данных .
Хотите узнать немного больше о полезности лямбда-функции? Посмотрите, этой другой статье о том, Потоки и как использовать лямбда-функции с коллекциями.
Поздравления ! Теперь вы знаете, лямбда-выражения в Java 8, и может использовать это знание для доставки проекта | быстро/| и , расти карьера.
Хотите получить доступ к его содержимому на видео? Смотреть здесь!
Хотите получать мои лучшие советы для написания кода, высокое качество и доставки проектов в срок? Потом перейдите сюда .
Хотите узнать, как улучшить свой код каждый день? Тогда последует в twitter : в
Уже видел некоторый код с лямбда-функции в последнее время? Или знаете другие ситуации, в которых мы могли бы использовать? Оставьте комментарий! Поделитесь тоже!
Понравилось, что узнали? Поделитесь с другими Devs!
Post Java 8: Понять, легко лямбда-функции, главной новинкой! появился первый в ринальдо.dev .
Оригинал: “https://dev.to/rinaldodev/java-8-entenda-facilmente-funes-lambda-a-principal-novidade-59b”