如何使用Java 8 Optionals(功能编程)替换下面的代码?
ClassA classA = dbService.findByA(a);
if (classA == null) {
classA = dbService.findByB(b);
}
if (classA == null) {
throw new Exception();
}
return classA;
编辑:
也许如果我将使findByA
和findByB
返回Optional可以使我的代码更清晰地使用函数式编程?
答案 0 :(得分:3)
return Optional.ofNullable(Optional.ofNullable(dbService.findByA(a))
.orElseGet(() -> dbService.findByB(b)))
.orElseThrow(() -> new Exception());
或者,Java 9更好一些:
Optional.ofNullable(dbService.findByA(a))
.or(() -> Optional.ofNullable(dbService.findByB(b)))
.orElseThrow(() -> new Exception());
答案 1 :(得分:2)
这可以工作
Optional.ofNullable(
Optional.ofNullable(dbService.findByA(a))
.orElseGet(() -> dbService.findByB(b))
).orElseThrow(Exception::new);
我认为这不会更好。
答案 2 :(得分:1)
首先,使您的方法dbService.findByA
和dbService.findByB
返回Optional
。这就是基础。如果不这样做,就不会进行“功能性”编程。
第二,使用Java 9+(或更高版本,最新版本)。
然后只需使用以下内容:
ClassA instance = dbService.findByA(a)
.or(() -> dbService.findByB(b))
.orElseThrow(Exception::new);
如果您坚持使用Java 8,请执行以下操作:
ClassA instance = Optional.of(() -> dbService.findByA(a)) // Optional<Optional<ClassA>>
.orElseGet(() -> dbService.findByB(b)) // Optional<ClassA>
.orElseThrow(Exception::new);