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

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

Привет Java-программистам Java 1.8 SE предлагает нам много новых функций, но среди них есть и такие… Помеченный как java, лямбда, функциональный, java 8.

Привет программистам 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');
}

Здесь,

  1. общедоступный -> Модификатор доступа
  2. void -> Возвращаемый тип
  3. ‘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.

Некоторые из них перечислены ниже: ( с доступным абстрактным методом )

  1. Предикат – логическое значение тест (T t)
  2. Функция R> – R применить R>
  3. - R применить (T t) Потребитель
  4. - недействителен принять (T t) Поставщик

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

Вывод:

1. Функциональный интерфейс может быть записан в виде лямбда-выражения/оператора.

2. @Функциональный интерфейс аннотация для ограничения/принуждения интерфейса быть идеальным функциональным интерфейсом.

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

4. В java в качестве утилиты существует несколько предопределенных функциональных интерфейсов.

Встретимся позже!

Оригинал: “https://dev.to/groundlevelgeek/lambda-expression-35c8”