Sobes.tech
Middle

Какви са лямбда изразите в Java и какви възможности предоставят?

sobes.tech AI

Отговор от AI

Ламбда изразите в Java са кратък синтаксис за създаване на анонимни функции (методи без име), които могат да бъдат предавани като аргументи или съхранявани в променливи. По същество, това са функционални интерфейси, реализирани "на лету".

Основните възможности, които предоставят ламбда изразите:

  • Облекчаване на синтаксиса: Значително съкращават boilerplate кода при работа с функционални интерфейси в сравнение с анонимните вътрешни класове.

    // Преди ламбда:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Класически Runnable");
        }
    };
    
    // С ламбда:
    Runnable lambdaRunnable = () -> System.out.println("Ламбда Runnable");
    
  • Функционално програмиране: Позволяват писане на по-функционален код, където функциите са първокласни граждани и могат да бъдат предавани като данни. Това е ключово за работата с Stream API.

    // Филтриране на списък с използване на ламбда
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Работа с Stream API: Ламбда изразите са основата за повечето операции в Stream API (filter, map, forEach, reduce и др.), осигурявайки лаконичност и паралелно изпълнение.

    // Преобразуване и извеждане на елементи от стрийм
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // ламбда за мапиране
           .forEach(System.out::println); // препратка към метод (вариант на ламбда)
    
  • Подобрена четливост: За прости операции ламбда прави кода по-четлив и разбираем, фокусирайки вниманието върху самата операция, а не върху синтаксиса на анонимната класа.

  • Реализация на функционални интерфейси: Могат да се използват навсякъде, където се очаква екземпляр на функционално интерфейс (интерфейс с една абстрактна метода).

Синтаксис на ламбда израза: (параметри) -> { тяло }

Примери:

  • Без параметри, без връщана стойност: () -> System.out.println("Hello")
  • С един параметър, без връщана стойност: name -> System.out.println("Hello, " + name) (може да се пропуснат скобите около един параметър)
  • С няколко параметъра, без връщана стойност: (x, y) -> System.out.println(x + y)
  • С параметри, с връщана стойност: (a, b) -> a + b (ако тялото съдържа едно изразяване, неговата стойност се връща неявно)
  • С параметри, с блок код и връщана стойност: (a, b) -> { int sum = a + b; return sum; } (явното return е необходимо за блоковете код)