Створено за допомогою 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