如何在lambda中链接Optional#ifPresent()而不嵌套?

时间:2017-10-18 03:00:42

标签: java lambda optional

我有以下代码块,需要检查是否存在多个嵌套变量。这些原来是空检查,我已将其替换为OptionalifPresent()

我想使用ifPresent()而不是查询get()来缓解潜在的运行时异常。但这导致了大量的嵌套。

在这个例子中我可以利用lambdas来实现没有嵌套的相同流程吗?

void SomeMethod() {
    procA().ifPresent(a -> {
       procB(a).ifPresent(b -> {
          // Do something

          return;
       });
    });

    throw new SomeException();
}

2 个答案:

答案 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());
    }
}