Привет программистам Java
Java 1.8 SE предлагает нам много новых функций, но среди этих функций одна кричит больше, чем любая другая функция… знаешь Что?? Да, ты понял это! Лямбда-выражение .
Java была полностью основана на концепциях ООП, Действительно ли мы собираемся начать функциональное программирование с использованием лямбда-выражения в java??
Хорошо! Сначала давайте попробуем понять и разложить лямбда-выражение
упрощенным способом, чтобы эта новая терминология уместилась в нашем мозгу.
Итак, что мы понимаем под выражением? Выражение – это не что иное, как исчисление утверждение в математике, которое дает нам некоторый результат, когда мы придаем ему некоторое значение.
Как выражение:
result = (a+b)^2;
Итак, здесь у нас есть утверждение, мы, как java-программисты, пишем утверждения повсюду на java.
Это подло? Все операторы, которые мы пишем в java world, являются лямбда-выражениями/операторами.
Конечно, все ваши утверждения могут быть лямбда-выражением/утверждением. Но что особенного в java, что делает оператор лямбда-выражением/оператором?
Особая вещь – это тип, да, вы правильно читаете!
Java – это все о типе/классе. Если вы пишете оператор, и этот оператор имеет некоторый тип, да, вы поняли, что это лямбда-выражение/оператор.
Но здесь вы можете подумать, что как программист Java, я, конечно, пишу инструкции, но все, что мне нужно писать внутри метода/функции. Следовательно, ни одно утверждение не относится непосредственно к какому-либо типу. Они находятся внутри некоторого метода, а этот метод, в свою очередь, принадлежит классу/типу. Тогда как утверждение может быть типа? Интересно…??
Давайте посмотрим на фрагмент метода java
public class Application{ public void printActiveEmployee(){ System.out.println('Mark Mahindra'); } }
Здесь оператор находится внутри метода, а метод написан явно внутри класса, что означает, что метод принадлежит типу, но не оператору. Оператор принадлежит методу.
т.е. Ни одно утверждение не относится к какому-либо типу?? Да, Утверждения, которые мы пишем, предназначены для методов, а не для какого-либо типа.
Тогда что же является блокиратором для того, чтобы мое утверждение стало каким-либо типом, каким?? Да, это метод/функция.
Если каким-то образом удастся удалить метод, мои операторы, написанные внутри него, будут напрямую принадлежать классу/типу.
Давайте посмотрим, как разработчики/создатели Java додумались удалить этот метод. Что обычно имеет метод??
Модификатор доступа > Возвращаемый тип > Имя > Параметры > Тело
public void printActiveEmployee(){ System.out.println('Mark Mahindra');
}
Здесь,
- общедоступный -> Модификатор доступа
- void -> Возвращаемый тип
- ‘printEmployee’ -> Имя метода
Они просто удаляют все эти три вещи из метода и оставляют вам круглые скобки и тело.
(){ System.out.println('Mark Mahindra'); }
Здесь вы просто добавите стрелку ‘->’ в этот синтаксис.
И, конечно, если это оставило синтаксис () -> {}
не под каким-либо методом, поэтому он напрямую принадлежит типу/классу, он записан внутри.
В нашем мире все, что не имеет имени, известно как Анонимное. Человек без имени – это анонимный человек, вещь без имени – это анонимная вещь, поэтому метод без имени – это анонимный метод.
Итак, если мы напишем метод без описания Спецификатора доступа, возвращаемого типа и имени метода, это будет анонимный метод/функция, только со скобками и телом () -> {}
.
Да, пока что у нас есть наш синтаксис лямбда-выражения. Таким образом, мы можем сказать, что метод без имени является лямбда-выражением/оператором, потому что он находится непосредственно под классом/типом, поэтому этот оператор относится к этому типу.
Но вот в чем загвоздка: классы Java еще не эволюционировали, чтобы поддерживать любое поведение/оператор, написанный непосредственно внутри класса, т.Е. без его метода-оболочки.
Итак, как мы можем присвоить тип моему анонимному методу или операторам, которые я хочу записать как анонимные, каким образом?
А вот и интерфейс на помощь. Интерфейс может разрешать запись, реализацию его метода или инструкции без указания его имени, возвращаемого типа и модификаторов доступа. То же самое, что и анонимный, верно?
Поэтому, если я напишу интерфейс, имеющий метод, я могу реализовать этот метод как анонимный метод/функцию или ничего, кроме лямбда-выражения.
Давайте посмотрим на это
public interface MyInterf { public void greetJavaProgrammer(); }
Теперь давайте напишем анонимные утверждения для этого метода.
public class Application { MyInterf myInterf = () -> { ... // write your statements here }; myInterf.greetJavaProgrammer(); }
Да, это анонимное утверждение является нашим лямбда-выражением.
Итак, теперь мы знаем, что метод интерфейса может быть записан как лямбда-выражение/оператор.
Зачем ждать! создайте свой интерфейс и напишите в нем лямбда-выражение.
Подожди Немного! Интерфейс может иметь множество абстрактных методов.
Итак, если мы пишем лямбда-выражение для метода интерфейса, как компилятор Java/Java (в конце концов, он отвечает за коды) узнает, что мы пишем операторы (лямбда-выражение) для какого метода и мы уже видели, что лямбда-выражение явно ничего не сообщает об имени метода и всем остальном.
Итак, то, как Java помечает мое лямбда-выражение, относится к одному конкретному методу среди объявленных методов в интерфейсе.
Итак, здесь возникает ограничение, компилятор Java не может этого сделать. Он не может назначить лямбда-выражение определенному методу, если этот интерфейс имеет более одного абстрактного метода. Это сбивает с толку.
Поэтому Интерфейс, который имеет только один абстрактный метод , может быть записан как лямбда-выражение/оператор. Поскольку компилятор Java знает, что внутри интерфейса есть единственный метод, для которого вы пишете лямбда-выражение. Никакой двусмысленности для компилятора Java, верно?
И на самом деле, каждый программист Java знает, что интерфейс, имеющий только один абстрактный метод, – это Функциональный интерфейс .
Это означает, что только функциональный интерфейс может быть записан как лямбда-выражение/оператор.
Так что с этого момента, к счастью, создайте свой функциональный интерфейс и напишите лямбду для этого интерфейса/метода интерфейса.
Совет: Если вы хотите сделать любой интерфейс функциональным интерфейсом, сохраните в нем только один абстрактный метод. И если вы не хотите позволять какому-либо другому программисту делать его нефункциональным интерфейсом, вы можете добавить @FunctionalInterface аннотацию к этому интерфейсу, поэтому java заверяет вас, что никто больше не сможет добавлять абстрактный метод в этот интерфейс, даже случайно.
Java предоставила нам несколько предопределенных функциональных интерфейсов для использования их в качестве утилиты, а сама Java использует эти интерфейсы в своей библиотеке/API.
Некоторые из них перечислены ниже: ( с доступным абстрактным методом )
Предикат
– логическое значение тест (T t)Функция R>
– R применить R>- R
применить (T t) Потребитель- недействителен
принять (T t) Поставщик
Есть много других доступных вариантов этих функциональных интерфейсов, но это то, с чем я, безусловно, хотел бы поделиться в нашей следующей передаче знаний.
Вывод:
1. Функциональный интерфейс может быть записан в виде лямбда-выражения/оператора.
2. @Функциональный интерфейс аннотация для ограничения/принуждения интерфейса быть идеальным функциональным интерфейсом.
3. Мы можем написать наш пользовательский функциональный интерфейс, а затем написать для этого лямбда-выражение/оператор.
4. В java в качестве утилиты существует несколько предопределенных функциональных интерфейсов.
Встретимся позже!
Оригинал: “https://dev.to/groundlevelgeek/lambda-expression-35c8”