Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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-each | forEach Lambda |
|---|---|---|
| Контроль цикла | Полный (break, continue) | Ограниченный |
| Синтаксис | Классический | Функциональный |
| Производительность | Идентична | Идентична |
| Читаемость | Привычна | Современна |
Когда использовать Lambda в forEach
✓ Простые операции с элементами ✓ Использование Stream API ✓ Функциональный стиль программирования ✓ Работа с коллекциями и Map
Когда использовать традиционный for-each
✓ Нужен break/continue ✓ Индекс элемента важен ✓ Сложная логика с множественными условиями ✓ Старые версии Java (до Java 8)
Lambda в for-each делает код более выразительным и лаконичным, позволяя сосредоточиться на логике, а не на деталях итерации.