Scala Option.orElse 等效于 Java 可选

Scala Option.orElse equivalent for Java Optional

Option 定义了以下方法:

def orElse[B >: A](alternative : => scala.Option[B]) : scala.Option[B]

我试图在 Java 8 中找到类似的东西。我得出这个表达式:

private String userId() {
        return user.map(User::getUsername)
                .orElse(this.userId.orElseThrow(RuntimeException::new));
    }

其中 useruserId 都是 Optional,但即使定义了 user,也会以某种方式与 RuntimeException 一起崩溃。 Java 中是否有更实用的东西,然后才开始对 Optional 进行条件判断?

使用orElseGet:

private String userId() {
    return user.map(User::getUsername)
            .orElseGet(() -> this.userId.orElseThrow(RuntimeException::new));
}

当你使用普通的orElse时,它的参数是在orElse本身执行之前执行的,所以orElse只能return它,而不能决定是否执行它或不。使用 orElseGet 可以创建一个仅在 Optional 为空时执行的 lambda。

你要找的是Java9中介绍的Optional.or方法:

public Optional<T> or​(Supplier<? extends Optional<? extends T>> supplier)