2016-12-23 65 views
1

我有一個當前返回null的java方法。如何包裝java方法響應來處理空值

val maybeUser = Try(userService.getUser) match { 
    case Success(u) => u 
    case _ => None 
} 

後來,當我訪問maybeUser,我得到一個空值回:

val user = maybeUser match { 
    case Some(u) => u 
    case _ => User(1, "hello") 
} 

用戶最終被空。

回答

3

可以保護添加到Success其檢查null

val user = Try(userService.getUser) 
      .filter(user => user != null) 
      .getOrElse(User(1, "hello")) 
3

如果你確信你的功能不:

val maybeUser = Try(userService.getUser) match { 
    case Success(u) if u != null => u 
    case _ => None 
} 

您可以通過使用filtergetOrElse使這個短拋出任何異常,然後使用Option伴隨對象來處理空值。

Option(userService.getUser) 

選項的apply方法取空值並將其轉換爲None,然後您可以繼續進行模式匹配。

scala> Option(null) 
res0: Option[Null] = None 

如果你懷疑你的方法調用可能會拋出一個異常,然後做

Option(Try(userService.getUser).getOrElse(null)) 

然後模式匹配

1

而另一種方式來組合與選擇嘗試;)

Try(userService.getUser).toOption.flatMap(Option(_)) match { 
    case Some(user) => user 
    case None  => User(1, "hello") 
} 

但是,我發現m yself做更多的往往不是,是我自己寫的提取:

class NotNull[+A <: AnyRef](private val underlying: A) extends AnyVal { 
    def get: A = underlying 
    def isEmpty: Boolean = get == null 
} 

object NotNull { 
    def unapply[A <: AnyRef](a: A): NotNull[A] = NotNull(a) 
} 
然後

可以使用,如:

Try(userService.getUser) match { 
    case Success(NotNull(user)) => user 
    case _      => User(1, "hello") 
} 
0

這看起來可疑的,除非有一個錯字:在case Success(u) => u不必返回一個Option,但只是User(假設你的Java方法不返回一個Scala Option;如果是的話,可以返回null,你有更大的設計問題)。所以maybeUser的類型可能是AnyRef或者java.lang.Serializable,case Some(u)永遠不能匹配,並且user將永遠是User(1, "hello")

如果有一個錯字,你有case Success(u) => Some(u):沒有理由以匹配Try只是爲了您剛剛處理相同2箱子再次匹配的結果。只要結合匹配:

val user = Try(userService.getUser) match { 
    case Success(u) if u != null => 
    u 
    case _ => 
    User(1, "hello") 
} 

,除非你要使用超過一次maybeUser更多。