Использование orElseThrow с параметризованным Supplier в Java 8

Пройдите тест, узнайте какой профессии подходите

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

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

Для создания Supplier с конкретным параметром воспользуйтесь лямбда-выражением:

Java
Скопировать код
Supplier<Foo> fooSupplier = () -> new Foo("предустановленный параметр");
Foo fooInstance = fooSupplier.get(); // Получаем новый экземпляр Foo с "предустановленным параметром".

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

Кинга Идем в IT: пошаговый план для смены профессии

Использование ссылок на методы

Если требуется конструктор без аргументов, используйте ссылку на метод:

Java
Скопировать код
Supplier<Foo> fooSupplier = Foo::new;
Foo fooInstance = fooSupplier.get();

В случае, если вам требуются параметры, оптимальным будет выбор лямбда-выражения, поскольку ссылки на методы с параметрами функционировать не будут.

Создание пользовательских исключений с параметрами

С помощью лямбда-выражения возможно создание экземпляра собственного исключения:

Java
Скопировать код
Supplier<CustomException> exceptionSupplier = () -> new CustomException("Произошла ошибка");

Этот Supplier можно применять в методе orElseThrow():

Java
Скопировать код
Foo foo = someOptional.orElseThrow(exceptionSupplier);

Помощь от вспомогательных методов

Воспользуйтесь вспомогательным классом для создания Supplier для исключений, чтобы сделать ваш код адекватнее и консистентнее:

Java
Скопировать код
public class ExceptionSupplier {
    public static Supplier<CustomException> create(String message) {
        return () -> new CustomException(message);
    }
}

Foo foo = someOptional.orElseThrow(ExceptionSupplier.create("Произошла ошибка"));

Быстрая и эффективная обработка

Следите за обновлениями JDK, чтобы эффективно и оперативно использовать самые современные методы обработки исключений.

Подтверждение корректного создания экземпляра

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

Продолжайте проверять

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

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

Представьте Supplier в Java как многофункциональную кухонную машину:

Markdown
Скопировать код
Кулинарный Ассистент (🍳): Универсален и всегда готов закинуть что-то вкусненькое.

Пример Supplier:

Java
Скопировать код
Supplier<Meal> mealMaker = Meal::new; // 🍳 Готовим уникальные блюда!

Процесс готовки блюд:

Markdown
Скопировать код
Добавление **ингредиентов**:
- Вегетарианское 🥗: mealMaker.get(Ingredients::newVegetarian)
- Морепродукты 🍤: mealMaker.get(Ingredients::newSeafood)
- Десерт 🍰: mealMaker.get(Ingredients::newDessert)

Получается итоговое меню:

Markdown
Скопировать код
🥗 Вегетарианский салат – прозрачность и натуральность.
🍤 Блюдо из морепродуктов – восхитительный вкус океана.
🍰 Шоколадный торт – сладкое завершение.

Supplier адаптируется и меняется в соответствии с добавленными ингредиентами.

Продвинутое использование: шаблоны фабрики

Научите Supplier создавать объекты согласно сложным правилам:

Java
Скопировать код
Map<String, Supplier<Animal>> animalFactory = new HashMap<>();
animalFactory.put("dog", Dog::new);
animalFactory.put("cat", Cat::new);

Supplier<Animal> animalSupplier = animalFactory.get(animalType);
Animal pet = animalSupplier.get(); // Знакомьтесь с вашим новым другом!

Таким образом, каждый Supplier будет настраиваться на создание определенных объектов.

Совместимость с общими типами

Supplier прекрасно совместимы с обобщёнными типами:

Java
Скопировать код
public <T extends Number> T createNumber(Supplier<? extends T> sup) {
    return sup.get(); // И вот мы имеем новое число!
}

Это дает возможность унифицировать создание экземпляров типа T, который может являться представителем любого наследника Number.

Потенциальные подводные камни

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

Модернизируйтесь или отставайте!

Если вы не привязаны к использованию Java 8, изучите var в Java 10 и другие обновления в более новых версиях Java, которые могут повысить современность и эффективность вашего кода.

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

  1. Ссылки на методы (Учебные руководства Java™) – официальная документация Oracle.
  2. Лямбда-эквивалент для System.out::println – Stack Overflow – дискуссия на Stack Overflow.
  3. Лямбда-выражения в Java 8 – внутренний взгляд – статья, раскрывающая детали реализации лямбда.
  4. Учебник по Java 8 – winterbe – глубокое погружение в Java 8 с акцентом на лямбда-выражения и потоки.
  5. Руководство по java.util.function.Supplier в Java 8 с примерами – JavaBrahman – детальное руководство с практическими примерами использования Supplier.
Свежие материалы