我使用一个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
}