我有以下代码块,需要检查是否存在多个嵌套变量。这些原来是空检查,我已将其替换为Optional
和ifPresent()
。
我想使用ifPresent()
而不是查询get()
来缓解潜在的运行时异常。但这导致了大量的嵌套。
在这个例子中我可以利用lambdas来实现没有嵌套的相同流程吗?
void SomeMethod() {
procA().ifPresent(a -> {
procB(a).ifPresent(b -> {
// Do something
return;
});
});
throw new SomeException();
}
答案 0 :(得分:4)
您可以使用flatMap
:
procA().flatMap(this::procB).ifPresent(b -> {
// do something
});
至于return语句,你不能从lambda中的outer方法返回。如果要在缺少值时抛出自定义异常,请使用orElseThrow
:
B b = procA()
.flatMap(this::procB)
.orElseThrow(SomeException::new);
// do something with b
或者,您当然可以致电get
并让它抛出NoSuchElementException
。
答案 1 :(得分:0)
static Optional<String> getA() {
return Optional.of("a");
}
static Optional<String> getB(String b) {
return Optional.of(b + "!");
}
static void test() {
Optional<String> a, b;
a = getA();
if (a.isPresent() && (b = getB(a.get())).isPresent()) {
System.out.println(b.get());
}
}