可变lambda
因此,我对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
可变lambda