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));
}
其中 user
和 userId
都是 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)
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));
}
其中 user
和 userId
都是 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)