Розкриття лямбда-виразу Java

pic

Створено за допомогою Bing Image Creator

Лямбда-функції були введені в Java версії 8.0. Java 8 була випущена в березні 2014 року, тому з моменту написання цієї статті минуло майже десятиліття, і якщо ви є розробником на Java, то, ймовірно, вже використовували лямбда-вирази. Давайте заглибимося в лямбда-вирази та розглянемо, як вони походять від дуже базової форми коду на Java.

Синтаксис лямбда-виразу

Синтаксис лямбда-виразу простий, але й дещо дивний.

(params) -> { body }

Щоб зрозуміти лямбда-вираз глибше, важливо бути ознайомленим із функціональними інтерфейсами.

Що таке функціональний інтерфейс?

Хоча назва "функціональний інтерфейс" може здатися складною, це не так. Функціональні інтерфейси — це інтерфейси, які мають лише один абстрактний метод. Вони можуть містити будь-яку кількість методів за замовчуванням (default) і статичних методів (static), але тільки один абстрактний метод. І все.

Ось приклад функціонального інтерфейсу.

@FunctionalInterface  
public interface FI {  

 void m1();  

 default void m2() {  
 //якась логіка  
 }  

 static void m3() {  
 //якась логіка  
 }  
}

Java надає кілька вбудованих функціональних інтерфейсів, таких як Runnable і Comparable. Інтерфейс Runnable містить метод run(), а інтерфейс Comparable має метод compareTo().

Тепер створимо простий приклад, який демонструє функціональний інтерфейс та його реалізацію.

public interface Operations {  
 int doOperation(int num1, int num2);  
}  

public class OperationsImpl implements Operations {  
 @Override  
 public int doOperation(int num1, int num2) {  
 // виконати операцію  
 }  
}

Це традиційний спосіб реалізації, де ми можемо прописати логіку для методу doOperation(). Наприклад, якщо ми хочемо виконати додавання, це буде виглядати ось так.

public class OperationsImpl implements Operations{  
 @Override  
 public int doOperation(int num1, int num2) {  
 return num1+ num2;  
 }  

 public static void main(String[] args) {  
 Operations operations = new OperationsImpl();  
 int result = operations.doOperation(3,5);  
 System.out.println(result);  
 }  
}

Також ми можемо зробити те ж саме за допомогою анонімного класу.

public class OperationsImpl {  
 public static void main(String[] args) {  
 new Operations(){  
 @Override  
 public int doOperation(int num1, int num2) {  
 return num1 + num2;  
 }  
 };  
 }  
}

Як бачимо, в цих традиційних підходах є багато кроків, які потрібно виконати. Що якщо можна зробити те ж саме значно простіше? Так, це можливо завдяки лямбда-виразам.

Зверніть увагу на абстрактний метод у функціональному інтерфейсі. Тип повернення, ім’я методу та параметри вже визначені. Тому нам залишається лише реалізувати метод. Крім того, не може бути інших абстрактних методів, оскільки це функціональний інтерфейс.

Тож чому ж ми переписуємо одне й те саме, коли використовуємо метод? Ми можемо усунути це і спростити виклик методу, як показано нижче.

public class OperationsImpl {  
 public static void main(String[] args) {  
 Operations operations = (int num1, int num1) -> { return num1+ num1; };  
 System.out.println(operations.doOperation(3, 5));  
 }  
}

Зверніть увагу, що нам навіть не потрібно реалізовувати інтерфейс у класі OperationsImpl.

Оскільки лямбда-вираз складається лише з одного рядка, ми можемо опустити фігурні дужки і ключове слово return.

public class OperationsImpl {  
 public static void main(String[] args) {  
 Operations operations = (int num1, int num1) -> num1 + num1;  
 System.out.println(operations.doOperation(3, 5));  
 }  
}

Цей підхід набагато простіший і чистіший порівняно з традиційним способом. Як ми побачили, довгі перевизначення в реалізованих класах можна повністю відкинути.
Також це надає нашому коду сучасного вигляду!

Висновок

Введення лямбда-виразів у Java 8 стало значним етапом еволюції в тому, як ми пишемо і сприймаємо код на Java. Завдяки лямбда-виразам, ми отримали можливість використовувати компактні та виразні програмні патерни, що дозволяє не тільки зменшити кількість шаблонного коду, а й відкриває потужні можливості, такі як потоки (streams).

Опанувавши цю функцію, ви зможете писати код у функціональному стилі та змінити свій підхід до програмування на Java, зробивши його більш сучасним.

Щасливого кодування!

Перекладено з: Unfold Java Lambda Expression

Leave a Reply

Your email address will not be published. Required fields are marked *