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



Итак, теперь мы знаем, что Lambdas обеспечивает функциональное программирование на Java, но как нам писать лямбда-выражения?

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

Так как же писать лямбда-выражения?

Ниже приведен синтаксис лямбда-выражений.

 parameter -> code
(parameter1, parameter2,....) -> code
(parameter1, parameter2,....) -> { code block }

Синтаксис выглядит просто, но есть ли какие-то правила написания лямбда-выражения? Да это так.

  • Лямбда-выражения могут состоять из одной строки или могут состоять из нескольких операторов, и если они состоят из более чем одной строки, фигурные скобки обязательны.
  • Лямбда-выражения с оператором return, если они явно указаны, всегда должны быть заключены в фигурные скобки, но если ключевое слово return не указано, это не обязательно
(x,y) -> { return x > y };  // curly braces mandatory
(x,y) -> x > y;             // curly braces not mandatory

А как насчет переменных и лямбда-выражений?

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

Так что же является окончательным? Это переменная, которой после присвоения значения она уже не подлежит изменению.

Но все же остается вопрос…. Как компилятор может узнать, какой тип переменных передается в параметре лямбда или тип возвращаемого значения лямбда?

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

Для реализации новых лямбда-выражений Java 8 уже поставляется с несколькими предопределенными функциональными интерфейсами, охватывающими все часто используемые операции как часть пакета java.util.function.

Ниже приведены основные 4 функциональных интерфейса, которые наиболее часто используются.

  1. Предикат
  2. Потребитель
  3. Поставщик
  4. Функция

Так что же делают эти 4 функциональных интерфейса?

** Предикат **

Как следует из названия, предикат используется для проверки чего-либо, является ли оно истинным или ложным. Таким образом, этот функциональный интерфейс принимает любое количество входных данных, но всегда возвращает логическое значение, а имя метода также «test()».

** Потребитель **

Потребительский интерфейс потребляет ввод, но никогда ничего не возвращает. Имя метода в этом интерфейсе — «accept()».

** Поставщик **

Интерфейс поставщика предоставляет это означает, что он не принимает никаких входных данных, но что-то возвращает. Этот интерфейс имеет метод под названием «get()».

** Функция**

Интерфейс функции принимает входные данные, а также возвращает выходные данные. Это используется в основном для обработки любого ввода и возврата его значения. Этот интерфейс имеет метод под названием «apply()».

Это базовые функциональные интерфейсы, существуют и другие варианты вышеперечисленных функциональных интерфейсов, основанные на различных входных параметрах и названные соответственно, такие как BiConsumer, BiPredicate, BiFunction и т. д.….