2013-02-02 47 views
2

我有以下代碼:更強大的getOrElse?

val userName = users.get(userID) match { 
    case Some(user) => user.name 
    case None => "Invalid User ID" 
} 

有沒有寫這個更簡潔的方式?

我想知道是否有類似於getOrElse的東西,如果它成功(提取用戶名),可以讓我應用一個函數,否則返回一個普通的值。

回答

4

不在一個方法調用,而是兩個:

users.get(userID).map(_.name).getOrElse("Invalid User ID") 

哎呀,顯然Option.fold在斯卡拉2.10最後加入,據@ sschaef的答案。

+1

@Eduardo是的,我已經編輯它。 –

12
scala> Map("a" -> 1).get("a").fold("invalid user id")("value:"+_) 
res15: String = value:1 

scala> Map("a" -> 1).get("b").fold("invalid user id")("value:"+_) 
res16: String = invalid user id 

Option.fold牙齒有問題的類型推斷,對於潛在的隱患看到another答案。

+0

我的例子會轉換爲:'users.get(userID).fold(「無效的用戶ID」)(_。name)'? – Eduardo

+0

難以在REPL中測試它嗎?不過,我認爲是的,它應該以這種方式工作。 – sschaef

+0

我仍然在2.9,所以它不適合我。但它看起來非常簡潔。我希望能夠儘快升級。謝謝。 – Eduardo