Scala语言使用Option代替Null

示例

在Java(和其他语言)中,使用null是表示引用变量没有附加值的常用方法。在Scala中,使用Option优于使用null。选项包装可能为null的值。

None 是包装空引用的 Option 的子类。有些是包装非空引用的 Option 的子类。

包装引用很容易:

val nothing = Option(null) // 没有
val something = Option("Aren't options cool?") // Some("Aren't options cool?")

这是调用Java库时可能返回空引用的典型代码:

val resource = Option(JavaLib.getResource())
// 如果为null,则resource = None
// 其他资源=一些(资源)

如果getResource()返回null值,resource将是一个None对象。否则它将是一个Some(resource)对象。处理an的首选方法Option是使用Option类型中可用的高阶函数。例如,如果要检查您的值是否不是None(类似于检查if value == null),则可以使用以下isDefined函数:

val resource: Option[Resource] = Option(JavaLib.getResource())
if (resource.isDefined) {  // 资源是`Some(_)`类型
  val r: Resource = resource.get
  r.connect()
}

同样,要检查null参考,您可以执行以下操作:

val resource: Option[Resource] = Option(JavaLib.getResource())
if (resource.isEmpty) { // 资源是“无”类型。
  System.out.println("Resource is empty! Cannot connect.")
}

最好通过将a的包装值视为monad并使用来处理其包装值的条件执行Option(不使用“ exceptional”Option.get方法):Optionforeach

val resource: Option[Resource] = Option(JavaLib.getResource())
resource foreach (r => r.connect())
// 如果定义了r,则运行r.connect()
// 如果r为空,则不执行任何操作

如果Resource需要一个实例(相对于Option[Resource]实例),您仍然可以使用它Option来防止空值。这里的getOrElse方法提供了一个默认值:

lazy val defaultResource = new Resource()
val resource: Resource = Option(JavaLib.getResource()).getOrElse(defaultResource)

Java代码不会轻易处理Scala的Option,因此在将值传递给Java代码时,最好在适当的情况下解开Option,传递null或明智的默认值:

val resource: Option[Resource] = ???
JavaLib.sendResource(resource.orNull)
JavaLib.sendResource(resource.getOrElse(defaultResource)) //