Java Lambda

Оновлено: 22.05.2023

Лямбда-вирази Java

У Java 8 додано лямбда-вирази.

Лямбда-вираз - це короткий блок коду, який отримує параметри і повертає значення. Лямбда-вирази схожі на методи, але їм не потрібне ім'я, і вони можуть бути реалізовані прямо в тілі методу.

Синтаксис

Найпростіший лямбда-вираз містить один параметр і вираз:

parameter -> expression

Щоб використовувати більше одного параметра, візьміть їх у круглі дужки:

(parameter1, parameter2) -> expression

Вирази обмежені. Вони повинні негайно повертати значення і не можуть містити змінні, присвоєння або оператори типу if або for. Для виконання більш складних операцій можна використовувати блок коду з фігурними дужками. Якщо лямбда-вираз повинен повертати значення, то блок коду повинен містити оператор повернення.

(parameter1, parameter2) -> { code block }

Використання лямбда-виразів

Лямбда-вирази зазвичай передаються як параметри функції:

Використовуйте лямбда-вираз у методі forEach() ArrayList, щоб вивести кожен елемент списку:

ArrayList
forEach()
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    numbers.forEach( (n) -> { System.out.println(n); } );
  }
}

Лямбда-вирази можна зберігати у змінних, якщо тип змінної є інтерфейсом, який має лише один метод. Лямбда-вираз повинен мати таку саму кількість параметрів і такий самий тип повернення, як і цей метод. У Java вбудовано багато таких інтерфейсів, наприклад, інтерфейс Consumer (знаходиться у пакеті java.util), який використовується у списках.

Використовуйте інтерфейс Споживач Java для зберігання лямбда-виразу у змінній:

Consumer
import java.util.ArrayList;
import java.util.function.Consumer;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    Consumer<Integer> method = (n) -> { System.out.println(n); };
    numbers.forEach( method );
  }
}

Щоб використовувати лямбда-вираз у методі, метод повинен мати параметр з типом однометодного інтерфейсу. Виклик методу інтерфейсу призведе до виконання лямбда-виразу:

Створити метод, який отримує лямбда-вираз як параметр:

interface StringFunction {
  String run(String str);
public class Main {
  public static void main(String[] args) {
    StringFunction exclaim = (s) -> s + "!";
    StringFunction ask = (s) -> s + "?";
    printFormatted("Hello", exclaim);
    printFormatted("Hello", ask);
public static void printFormatted(String str, StringFunction format) {
    String result = format.run(str);
    System.out.println(result);