因此,我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是,没有明显的方法可以在块中执行else操作,因为只有isPresent
方法,除非您使用的是老式的if语句。 第二个问题当然是古老的板栗,即使您能够做到,这些方法也将无法引发已检查的异常。 (是的,您可以包装RuntimeException,但这不是最漂亮的。)
我发现的解决方法是使用map函数作为成功案例,使用orElseGet返回失败案例。 在两个分支中,代码都有一个lambda返回lambda来返回ThrowingRunnable的实例。 然后在最后调用run()
,它可以引发任何想要的异常。
@FunctionalInterface
public interface ThrowingRunnable<E extends Throwable> {
public void run() throws E;
}
Optional<Credential> credential = ....
credential.<ThrowingRunnable<IOException>>map(auth -> () -> {
PasswordWrapper pw = auth.getToken();
... // something that might throw an IOException
}).orElseGet(() -> () -> {
response.setStatus(401);
LOGGER.log(Level.INFO, "credential is not found");
}
).run();
对于这个特定的用例,这可能是过多的; 但是我可以看到该技术在其他地方很有用,值得了解它的外观,因此在其他代码中也不足为奇。
翻译自: https://www.javacodegeeks.com/2016/03/lambda-lambda-ifelse-optional.html