因此,我对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
本文探讨了在Java 8中使用Optional接口处理可能抛出已检查异常的情况。通过使用map和orElseGet方法,结合自定义的ThrowingRunnable接口,作者提供了一种优雅地处理Optional值不存在或操作可能抛出异常的解决方案。
657

被折叠的 条评论
为什么被折叠?



