Lambda выражения в Java — как это работает

lambda expression

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

На сайте уже есть материал о функциональных интерфейсах и Stream API и лямбда выражениях. Настоятельно рекомендую ознакомиться для полного понимания картины.

Функциональный интерфейс — это интерфейс с единственным абстрактным методом и аннотацией @FunctionalInterface.

Для примера я как всегда возьму самый нелепый случай в программировании, который никоим образом нельзя повторять в реальных условиях.

Допустим у нас есть интерфейс:

Код   
  1. @FunctionalInterface
  2. public interface MathInterface<T> {
  3.  
  4.     T getMax(T first, T next);
  5. }

 

Для того, чтобы написать реализацию этого метода без лямбда выражения можно можно использовать конструкцию:

Код   
  1. new MathInterface<Integer>() {
  2.  
  3.             @Override
  4.             public Integer getMax(Integer first, Integer second) {
  5.                 if (first > second)
  6.                     return first;
  7.                 return second;
  8.             }
  9.         };

 

В результате у меня получилось создать вот такой метод:

Код   
  1. public static Integer getMaxValue(Integer first, Integer second) {
  2.         new MathInterface<Integer>() {
  3.  
  4.             @Override
  5.             public Integer getMax(Integer first, Integer second) {
  6.                 if (first > second)
  7.                     return first;
  8.                 return second;
  9.             }
  10.         };
  11.         return second;
  12.     }

 

Теперь можно использовать данный метод: Main.getMaxValue(2, 4) — даст нам 4.

Lambda выражения созданы, чтобы заменить никому не нужный громадный и избыточный код.

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

  • параметры (ноль или больше)
  • ->
  • блок кода (если код состоит больше чем из одного выражения нужны фигурные скобки {}
Код   
  1. static MathInterface<Integer> maxValueLambda = (Integer a, Integer b) -> {
  2.         if(a>b) return a;
  3.         else return b;
  4.     };

 

Код стал меньше и чище. Для использования данного выражения достаточно выражения: maxValueLambda.getMax(2, 4)

Полный код программы:

Код   
  1. public class Main {
  2.  
  3.     public static Integer getMaxValue(Integer first, Integer second) {
  4.         new MathInterface<Integer>() {
  5.  
  6.             @Override
  7.             public Integer getMax(Integer first, Integer second) {
  8.                 if (first > second)
  9.                     return first;
  10.                 return second;
  11.             }
  12.         };
  13.         return second;
  14.     }
  15.    
  16.     static MathInterface<Integer> maxValueLambda = (Integer a, Integer b) -> {
  17.         if(a>b) return a;
  18.         else return b;
  19.     };
  20.    
  21.  
  22.     public static void main(String[] args) {
  23.         System.out.println(Main.getMaxValue(2, 4));//old school interface variant
  24.        
  25.         System.out.println(maxValueLambda.getMax(2, 4));
  26.     }
  27.  
  28. }

Теперь Вы знаете, как можно использовать преимущества функционального программирования. Лямбда выражения — это основа функционального программирования в языке Java и путь к краткому написанию кода где это возможно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *