ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Решение для методов void в Java8 без изменения типа возврата

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения типа функции методов, которые возвращают void и принимают один аргумент, применяется Consumer<T>:

Java
Скопировать код
Consumer<String> echo = System.out::println; // Простой вывод на экран, echo.accept("Эхо");

Для методов без аргументов и с возвращаемым типом void подходит Runnable:

Java
Скопировать код
Runnable show = () -> System.out.println("Показ");  // Запускаем вывод, show.run();

Если метод принимает два аргумента и возвращает void, то используйте BiConsumer<T, U>:

Java
Скопировать код
BiConsumer<Integer, Integer> addAndPrint = (x, y) -> System.out.println(x + y); // Сложение с выводом, addAndPrint.accept(1, 2);
Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Введение в функциональные интерфейсы

Void-методы с одним параметром: Consumer<T>

Consumer<T> идеален для функций, которые не возвращают результат, принимают один аргумент и реализуют метод accept(T t):

Java
Скопировать код
Consumer<Double> squareRootPrinter = Math::sqrt;  // Выводим корень числа, squareRootPrinter.accept(4.0);

Void-методы с двумя и более параметрами: BiConsumer и другие

BiConsumer<T, U> подходит для функций, которые принимают два аргумента и не возвращают значение. При большем количестве аргументов можно использовать собственные функциональные интерфейсы или применить метод инкапсуляции в объекты.

Сценарии без параметров: Runnable

Runnable — это основа для беспараметрических функций, возвращающих void, часто используемая в многопоточных задачах:

Java
Скопировать код
Runnable greet = () -> System.out.println("Привет, мир!"); // Передаем приветствие миру, greet.run();

Когда стандартные интерфейсы не подходят: Собственные функциональные интерфейсы

Если стандартных интерфейсов недостаточно, можно определить свои:

Java
Скопировать код
@FunctionalInterface
interface Thunk {
    void apply();
}

Thunk petRock = () -> {}; // Этот камень ничего не делает, но он функционален.

Такой подход улучшает понятность кода и облегчает его адаптацию.

Использование ссылок на методы для возвращения void к жизни

Ссылки на методы позволяют сокращать лямбда-выражения в Java. Они актуальны в случаях, когда метод возвращает void:

Java
Скопировать код
Consumer<List<String>> sort = Collections::sort; // Магия сортировки.
sort.accept(list); // Теперь список отсортирован.

Решение для API, ожидающих Void: null

API, требующие Function<T, Void>, можно обработать, возвращая null:

Java
Скопировать код
Function<String, Void> logger = s -> { System.out.println(s); return null; }; // Информативный логгер. Всегда завершается молчанием.

Говорящие имена для интерфейсов: Код как искусство

Именование функциональных интерфейсов должно быть информативным и помочь понять механику кода:

Java
Скопировать код
@FunctionalInterface
interface Action {
    void perform();
}

Action saveAction = () -> {/* код, который тихо спасает мир */};

Визуализация

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

ИнструментНазначениеТип функции в Java 8
🔨 (Молоток)Забить гвоздь (void-метод)Runnable
🔧 (Гаечный ключ)Закрутить болт (void-метод)Consumer<Bolt>
Java
Скопировать код
// Время работы для молотка!
Runnable task = () -> System.out.println("Гвоздь встретил молоток. Работа выполнена.");

// Гаечный ключ и болт: "Теперь ты на месте!"
Consumer<Bolt> tighten = Bolt::tighten;
tighten.accept(new Bolt());

Выбирая подходящий инструмент в зависимости от задачи, вы сможете написать код, который будет ясным и легко управляемым.

Полезные материалы

  1. Лямбда-выражения в Java 8 — погружение в увлекательный мир лямбда-выражений.
  2. Ссылки на методы в Java 8 — освоение техники написания более сжатого кода с помощью ссылок на методы.
  3. Функциональные интерфейсы в Java 8 — официальное руководство по функциональным интерфейсам.
  4. Учебник Java 8: Быстрое освоение лямбда-выражений — простое руководство Oracle по работе с лямбда-выражениями.
  5. Java SE 8: Быстрый старт с лямбдами — полезные рекомендации от Oracle о работе с лямбда-выражениями и потоками в Java 8.
  6. Использование Java Runnable — творческие способы применения Runnable.
  7. Руководство по Java 8 Optional — советы по избежанию проверок на null.