Для чего нужны функциональные интерфейсы Consumer<T>, DoubleConsumer, IntConsumer и LongConsumer?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Функциональные интерфейсы Consumer<T>, DoubleConsumer, IntConsumer и LongConsumer используются для представления операций, которые принимают один входной аргумент и не возвращают результата. Они являются частью пакета java.util.function.
Consumer<T>: Принимает аргумент любого типаT.DoubleConsumer: Принимает аргумент типаdouble. Это примитивная специализацияConsumer, что позволяет избежать автоупаковки и работает эффективнее.IntConsumer: Принимает аргумент типаint. Также примитивная специализация для эффективности.LongConsumer: Принимает аргумент типаlong. Еще одна примитивная специализация.
Основное применение этих интерфейсов — в Lambdas и ссылках на методы. Они часто используются в API стримов Java для выполнения побочных эффектов на элементах стрима, например, для вывода на консоль или модификации внешнего состояния.
Пример использования Consumer<T>:
// Создание Consumer, который выводит строку
Consumer<String> printConsumer = s -> System.out.println(s);
// Применение Consumer
printConsumer.accept("Привет, мир!");
// Использование в стриме
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println(n)); // Использование Consumer (лямбда)
Пример использования IntConsumer:
// Создание IntConsumer, который выводит число
IntConsumer printIntConsumer = i -> System.out.println(i);
// Применение IntConsumer
printIntConsumer.accept(10);
// Использование в стриме примитивных интов
IntStream.range(1, 5).forEach(printIntConsumer); // Более эффективно для примитивных типов
Примитивные специализации (DoubleConsumer, IntConsumer, LongConsumer) следует предпочитать их обобщенным аналогам Consumer<T> при работе с примитивными типами для улучшения производительности путем избегания операций боксинга/анбоксинга.