2012-02-07 42 views
1

我是電梯初學者,經常編碼這樣的事情:我使用Java方法返回一個對象或null,如果找不到值。所以我需要檢查空值:電梯初學者:如何使用帶有Java空值的Box

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

我可以使用Box概念寫出更短的代碼嗎?我已閱讀Lift-Wiki-documentation about the Box concept,但我不明白如何將其與Java空值一起使用。

回答

5

@TimN is right,你可以使用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 
1

與Scala的Option類似,您可以簡單地調用Box()並傳入可能爲或不可爲null的值,並且會得到一個可正常使用的Box對象。例如:

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

感謝您的快速回答,這個例子對我非常有幫助。 – Sonson 2012-02-07 07:32:32

+2

您不應該使用帶有空值的Box.apply。 null實際上是Box內的有效值。如果javaobject.findThing(xyz)返回null,則結果將爲Full(null)。你需要的是Box.legacyNullTest – 2012-02-07 15:19:45

+0

事實上,它看起來Box的apply()方法在2.4中改變了。對不正確的信息抱歉 - 你應該接受來自@dave的答案。 – 2012-02-07 16:33:54

1

您可以使用Box.legacyNullTest。此方法封裝在一個盒子中的任何對象的空安全的方式:

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

BoxlegacyNullTest返回以後可以照常使用在內涵或在模式匹配:

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 
}