如何将Box与Java null值一起使用



我使用一个Java方法,如果找不到值,它会返回一个对象或null。所以我需要检查空值:

val value = javaobject.findThing(xyz)
if(value != null) {
    value.doAnotherThing()
} else {
    warn("Value not found.")
}

我可以用Box概念把这个代码写得更短吗?我已经阅读了关于Box概念的LiftWiki文档,但我不明白如何将其与Java null值一起使用。

@TimN是对的,您可以使用Box(value)从可能的null值创建Box,但您会收到一个弃用警告。

scala> val v: Thing = null
v: Thing = null
scala> Box[Thing](v)
<console>:25: warning: method apply in trait BoxTrait is deprecated: Use legacyNullTest
              Box[Thing](v)

虽然你可以使用Box.legacyNullTest,但如果这就是你正在做的,那么我会坚持使用标准库并使用Option

Option(javaobject.findThing(xyz)) match {
    case Some(thing) => thing.doAnotherThing()
    case _ => warn("Value not found.")
}

如果你需要一个Box来传递,Option会自动转换为Box:

scala> val b: Box[Thing] = Option(v)
b: net.liftweb.common.Box[Thing] = Empty

类似于Scala的Option,您可以简单地调用Box()并传入可能为null或不为null的值,您将获得一个可以正常使用的Box对象。例如:

Box(javaobject.findThing(xyz)) match {
    case Full(thing) => thing.doAnotherThing()
    case _ => warn("Value not found.")
}

您可以使用Box.legacyNullTest。此方法以空安全的方式将任何对象封装在Box中:

def legacyNullTest[T](in: T): Box[T] = in match {
  case null => Empty
  case _ => Full(in)
}

legacyNullTest返回的Box稍后可以像往常一样用于理解或模式匹配:

for {
  fragment <- Box.legacyNullTest(uri.getFragment)
yield {
  doSth(fragment)
}

Box.legacyNullTest(uri.getFragment) match {
  case Full(fragment) =>
    doSth(fragment)
  case _ =>
    log.error("Missing fragment part")
    doSthElse
}

相关内容

最新更新