假设您有一个Optional<T>
变量,可以采用3个值之一:
否则,检索值T
或null
的最佳方法是什么?
这是一种方法:
Optional<String> op = ...
String str = op != null ? op.orElse(null) : null;
这是另一种方法:
String str = Optional.ofNullable(op).flatMap(innerOpt -> innerOpt).orElse(null);
每种技术都有哪些优缺点?再有一个表演者吗?还有斯卡拉式吗?更具可读性/可维护性吗?
答案 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中来简化处理的方法。不要让Optional
为null
!
答案 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