Какой интерфейс мы получаем в методе forEach()?
🔍 Где используется forEach()?
Метод forEach() появился в Java 8 как часть интерфейса Iterable, который теперь включает:
java
КопироватьРедактировать
default void forEach(Consumer<? super T> action)
Он также реализован в Stream API, в List, Set, Map и других коллекциях.
✅ Пример использования:
java
КопироватьРедактировать
List<String> names = List.of("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
Здесь name -> System.out.println(name) — это лямбда-выражение, реализующее интерфейс Consumer<String>.
🧠 Что такое Consumer<T>?
Интерфейс Consumer<T> описывает операцию, которая принимает один аргумент и не возвращает результата.
Это функциональный интерфейс, потому что у него только один абстрактный метод — accept(T t).
📦 Пакет: java.util.function
📘 Сигнатура:
java
КопироватьРедактировать
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after);
}
🔧 Примеры:
1. Использование с коллекцией:
java
КопироватьРедактировать
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n \* 2));
n -> System.out.println(n \* 2) — реализация Consumer<Integer>
2. Через класс:
java
КопироватьРедактировать
class PrintConsumer implements Consumer<String> {
public void accept(String s) {
System.out.println("Привет, " + s);
}
}
List<String> users = List.of("Анна", "Игорь");
users.forEach(new PrintConsumer());
3. Метод andThen() — последовательные действия:
java
КопироватьРедактировать
Consumer<String> greet = s -> System.out.println("Привет, " + s);
Consumer<String> exclaim = s -> System.out.println("!");
Consumer<String> both = greet.andThen(exclaim);
both.accept("Мир"); // Выведет: "Привет, Мир" и потом "!"
📚 Где ещё используется Consumer<T>?
-
Stream.forEach()
-
Iterable.forEach()
-
Map.forEach(BiConsumer)
-
Методы с колбэками
-
Обработка элементов в UI (JavaFX, Android и т.д.)
📌 Отличие от других функциональных интерфейсов
Интерфейс | Метод | Что делает |
---|---|---|
Consumer<T> | accept(T t) | Принимает значение, не возвращает |
--- | --- | --- |
Supplier<T> | get() | Возвращает значение, не принимает |
--- | --- | --- |
Function<T,R> | apply(T t) | Принимает и возвращает значение |
--- | --- | --- |
Predicate<T> | test(T t) | Проверяет условие (true/false) |
--- | --- | --- |
🧩 Вывод:
Свойство | Значение |
---|---|
Используемый интерфейс | java.util.function.Consumer<T> |
--- | --- |
Метод | accept(T t) |
--- | --- |
Где применяется | В Iterable.forEach(), Stream.forEach(), Map.forEach() и др. |
--- | --- |
Возвращает ли значение? | ❌ Нет |
--- | --- |
Можно ли комбинировать? | ✅ Да, через andThen() |
--- | --- |
Поддерживает лямбда-выражения | ✅ Да, начиная с Java 8 |
--- | --- |