Кажется, вам нужно немного подробнее изучить класс Optional
, а затем, возможно, опубликовать код, который работает без опций, используя try ... catch, то есть полный метод и то, что вы хотите сделать.А пока я отвечу, сделав предположение.
Предполагая, что у вас есть метод, подобный следующему, где вы хотите протестировать и вернуть объект, в то же время регистрируя и игнорируя любые исключения в обернутой логике проверки:
static class Service {
public <T> Predicate<T> getAndValidate(final T t) {
return null;
}
}
static <T> T test(final T t) {
final Service service = null; // need to initialize properly
// code without optional
try {
if (t != null) {
if (service.getAndValidate(t).test(t)) {
return t;
}
}
} catch (final Exception e) {
e.printStackTrace();
}
return null;
}
Теперь вы можете получить тот же код, но не многословно, используя Optional
.Вам не нужен map
с функцией идентификации, вы можете просто использовать filter
и обернуть вызов службы командой try ... catch.
static <T> T test(final T t) {
final Service service = null;
return Optional.ofNullable(t)
.filter(p -> {
try { // you can also wrap it with try..catch
return service.getAndValidate(p).test(p);
} catch (final Exception e) {
e.printStackTrace();
return false; // filter element on exception
}
}).orElse(null);
}
Однако я бы переосмыслил дизайн этого метода,Прежде всего, поймать Exception
вместо определенного подкласса, как правило, не очень хорошая идея, особенно если вы просто игнорируете его (и только печатаете трассировку стека).Если вы не можете обработать исключение осмысленным образом, почему бы не позволить вызывающей стороне обработать его дальше по стеку?Я хотел бы рассмотреть вопрос о возвращении Optional<T>
вместо null
(что в любом случае является намерением Optional
):
static <T> Optional<T> test(final T t) {
final Service service = null;
return Optional.ofNullable(t)
.filter(p -> service.getAndValidate(p).test(p));
}
В качестве альтернативы, вы также можете выбрать выбрасывание значимого исключения (возможно, даже создать вашесобственный подкласс RuntimeException):
static <T> T test(final T t) {
final Service service = null;
return Optional.ofNullable(t)
.filter(p -> service.getAndValidate(p).test(p))
.orElseThrow(() -> new IllegalArgumentException("The validation was not successful"));
}