在可为null的Optional中检索值的最佳方法是什么?

时间:2019-12-11 17:24:39

标签: java scala java-8 null optional

假设您有一个Optional<T>变量,可以采用3个值之一:

  • 值T
  • 一个可选的,其中T为空
  • 变量本身为null

否则,检索值Tnull的最佳方法是什么?

这是一种方法:

Optional<String> op = ...
String str = op != null ? op.orElse(null) : null;

这是另一种方法:

String str = Optional.ofNullable(op).flatMap(innerOpt -> innerOpt).orElse(null);

每种技术都有哪些优缺点?再有一个表演者吗?还有斯卡拉式吗?更具可读性/可维护性吗?

2 个答案:

答案 0 :(得分:3)

第一个可以简化为:

String str = op.orElse(null);

这将是您编写的最具可读性的可能性。

通常来说,Optional不是用于null的处理,但是在我看来,这只是一个口味问题。假设您必须像在kotlin中那样进行连锁:

object?.child?.grandChild

在每个级别,我们都将执行空检查。在Java中为:

object == null ? null : (object.child == null ? null : object.child.grandChild)

这有点令人讨厌。它会写:

Optional.ofNullable(object)
    .map(Parent::getChild)
    .map(Child::getGrandChild)
    .orElse(null);

可能会有些冗长,但对我来说-可读性强。正如我所说的-这是一个品味问题。

P.S。:Optional是一种通过将null包装在monad中来简化处理的方法。不要让Optionalnull

答案 1 :(得分:2)

调整Scala标签:

$ scala
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 11.0.3).
Type in expressions for evaluation. Or try :help.

scala> val x: java.util.Optional[String] = null
x: java.util.Optional[String] = null

scala> import scala.jdk.OptionConverters._
import scala.jdk.OptionConverters._

scala> Option(x).map(_.toScala).flatten.getOrElse("default")
res0: String = default