Какой интерфейс мы получаем в методе 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&lt;T&gt; {
void accept(T t);
default Consumer&lt;T&gt; andThen(Consumer&lt;? super T&gt; after);
}

🔧 Примеры:

1. Использование с коллекцией:

java
КопироватьРедактировать
List&lt;Integer&gt; numbers = List.of(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n \* 2));
n -> System.out.println(n \* 2)  реализация Consumer&lt;Integer&gt;

2. Через класс:

java
КопироватьРедактировать
class PrintConsumer implements Consumer&lt;String&gt; {
public void accept(String s) {
System.out.println("Привет, " + s);
}
}
List&lt;String&gt; users = List.of("Анна", "Игорь");
users.forEach(new PrintConsumer());

3. Метод andThen() — последовательные действия:

java
КопироватьРедактировать
Consumer&lt;String&gt; greet = s -> System.out.println("Привет, " + s);
Consumer&lt;String&gt; exclaim = s -> System.out.println("!");
Consumer&lt;String&gt; 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
--- ---