在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)) //