Спасибо за комментарии! Я проверил API Vavr Option
и Guava Optional
.
Guava Optional
даже менее богат методами, чем Java Optional
, поэтому это не решение.
То, что я нашел, - это метод класса Option
Vavr onEmpty
, который выполняет Runnable
, если значение Option пусто.
SomeValue value = Option.ofOptional(someOptional)
.onEmpty(() -> log.debug("nothing here"))
.filter(val -> {
if (!val.isSpecial()) {
log.debug("something here, but not special");
return false;
}
return true;
})
.getOrElseThrow(NothingHereException::new);
Этот пример отображает одно из отладочных сообщений и выдает исключение только в одном месте. Выглядит намного лучше.
Однако Vavr - большая библиотека с собственными коллекциями, функциональными интерфейсами и монадами, как указано выше. Это большая зависимость для проекта, и вряд ли она будет реализована в моем проекте или любом другом давно существующем проекте только для новой модной Optional
замены.
Плюс, Option
Вавра делает ' nt имеет что-то вроде onEmptyThrow
, так что это не так идеально =).
Эта ветка все еще открыта для предложений, но теперь для обходного пути Java 8, я думаю, этот комментарий может быть считается ответом.
ОБНОВЛЕНИЕ
Похоже, я нашел лучшее решение для подобных проблем. Несколько дней go я обнаружил аннотацию lombok @ExtensionMethod , которая делает возможные решения, подобные ниже
class Extensions {
public static <T, E extends Throwable> Optional<T> ifNotPresentThrow(Optional<T> opt, Supplier<E> exceptionSupplier) throws E {
if (!opt.isPresent()) {
throw exceptionSupplier.get();
}
return opt;
}
}
@ExtensionMethod(Extensions.class)
class Test {
public static void main(String[] args) {
// assume there is someNullable variable
// instead of writing
Extensions.ifNotPresentThrow(Optional.ofNullable(someNullable), NothingHereException::new)
.map(...);
// I can write
Optional.ofNullable(someNullable)
.ifNotPresentThrow(NothingHereException::new)
.map(...); // now possible to continue if optional present
}
}
С помощью этих Kotlin -подобных методов расширения можно добавить любой метод в Optional API. Lombok просто преобразует второй вариант в первый во время компиляции.
Однако эта функция является экспериментальной (кажется, что навсегда) и имеет возможные ошибки, а декомпилированный байт-код выглядит довольно грязно (с различными ненужными локальными переменными и т.д. c. )