如何用Optional(功能编程)替换旧的Java代码?

时间:2019-11-18 12:25:55

标签: java functional-interface

如何使用Java 8 Optionals(功能编程)替换下面的代码?

ClassA classA = dbService.findByA(a);

if (classA == null) {
    classA = dbService.findByB(b);
}

if (classA == null) {
    throw new Exception();
}

return classA;

编辑: 也许如果我将使findByAfindByB返回Optional可以使我的代码更清晰地使用函数式编程?

3 个答案:

答案 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.findByAdbService.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);