← Назад к вопросам

Что делает Lambda в For Each?

1.7 Middle🔥 151 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Lambda в For-Each цикле

Lambda-выражение в контексте for-each цикла определяет, что делать с каждым элементом коллекции. Это функциональный интерфейс, который принимает элемент коллекции и выполняет над ним операцию.

Синтаксис для-each с Lambda

List<String> names = Arrays.asList("Алиса", "Боб", "Виктор");

// Классический for-each (до Java 8)
for (String name : names) {
    System.out.println(name);
}

// С Lambda (Java 8+)
names.forEach(name -> System.out.println(name));

Как это работает

Метод forEach() — это терминальная операция, которая принимает Consumer<T> (функциональный интерфейс). Lambda-выражение реализует этот интерфейс:

// Полная форма Lambda
names.forEach((String name) -> {
    System.out.println("Имя: " + name);
});

// Сокращенная форма (тип выводится автоматически)
names.forEach(name -> System.out.println("Имя: " + name));

// Однострочный код в Lambda
names.forEach(System.out::println);

Примеры с разными функциональными интерфейсами

1. Consumer (выполняет действие)

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Выводит все числа
numbers.forEach(num -> System.out.println(num));

// Более сложное действие
numbers.forEach(num -> {
    if (num % 2 == 0) {
        System.out.println(num + " - четное");
    }
});

2. Stream с различными операциями

List<String> fruits = Arrays.asList("яблоко", "банан", "апельсин");

// Фильтрация и вывод
fruits.stream()
    .filter(fruit -> fruit.length() > 5)
    .forEach(fruit -> System.out.println(fruit));

// Преобразование и вывод
fruits.stream()
    .map(String::toUpperCase)
    .forEach(System.out::println);

3. Map с Lambda

Map<String, Integer> ages = new HashMap<>();
ages.put("Алиса", 25);
ages.put("Боб", 30);
ages.put("Виктор", 28);

// Итерация по Map
ages.forEach((name, age) -> 
    System.out.println(name + ": " + age + " лет")
);

Практические примеры

Обработка списка объектов

public class User {
    private String name;
    private int age;
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() { return name; }
    public int getAge() { return age; }
}

public class Main {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
            new User("Алиса", 25),
            new User("Боб", 30),
            new User("Виктор", 28)
        );
        
        // Вывод информации о пользователях
        users.forEach(user -> 
            System.out.println(user.getName() + ", " + user.getAge() + " лет")
        );
        
        // Фильтрация и вывод
        users.stream()
            .filter(user -> user.getAge() > 26)
            .forEach(user -> System.out.println(user.getName()));
    }
}

Различия: for-each vs forEach с Lambda

Аспектfor-eachforEach Lambda
Контроль циклаПолный (break, continue)Ограниченный
СинтаксисКлассическийФункциональный
ПроизводительностьИдентичнаИдентична
ЧитаемостьПривычнаСовременна

Когда использовать Lambda в forEach

✓ Простые операции с элементами ✓ Использование Stream API ✓ Функциональный стиль программирования ✓ Работа с коллекциями и Map

Когда использовать традиционный for-each

✓ Нужен break/continue ✓ Индекс элемента важен ✓ Сложная логика с множественными условиями ✓ Старые версии Java (до Java 8)

Lambda в for-each делает код более выразительным и лаконичным, позволяя сосредоточиться на логике, а не на деталях итерации.