之前過濾字符串我有以下其中obj爲JsObject
:創建選項[字符串]
val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String]
該代碼將創建一個Some("0")
如果大約件是「0」在數據庫中。
如何更改它,以便在字符串爲「0」時創建None
?
之前過濾字符串我有以下其中obj爲JsObject
:創建選項[字符串]
val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String]
該代碼將創建一個Some("0")
如果大約件是「0」在數據庫中。
如何更改它,以便在字符串爲「0」時創建None
?
如果你已經有一個Option
,並且不希望使用在某些情況下的值,然後filter
是您最地道的選擇:
val one = Option("1")
val zero = Option("0")
one.filter(_ != "0") //Some("1")
zero.filter(_ != "0") //None
使用這種方法,你的解決辦法是:
(obj \ "approx_pieces").asOpt[String].filter(_ != "0")
或者,您可以使用match
聲明來做到這一點。該JsValue
亞型播放都有着unapply
方法,這樣你就可以直接匹配他們:
(obj \ "approx_pieces") match {
case JsString(num) if num != "0" => Some(num)
case _ => None
}
您可能也有興趣在collect
方法:
(obj \ "approx_pieces").asOpt[String] collect {
case num if num != "0" => num
}
collect
是好的,因爲它可以讓你同時過濾和映射。
可以使用上述兩種方法一起,太:
Option(obj \ "approx_pieces") collect {
case JsString(num) if num != "0" => num
}
只有一個選擇是做什麼的OP要求 - 他們要求無,當0,而不是過濾,我猜想導致一個zip。 – 2015-03-13 13:53:27
@EdStaub當0和'Some(value)'時,這裏所有的方法都返回'None',否則我認爲這是OP想要的。如果過濾器函數返回false,則'Option'上的'filter'返回'None',就像部分函數未定義時的'collect'一樣。 – 2015-03-13 13:56:12
對 - 對不起。我一直在努力提高水平,有一系列的選項,並預計;-)。 – 2015-03-13 14:00:29
一些( 「0」)flatMap(X =>如果(X == 「0」)沒有限制其他一些(X)) – Maxim 2015-03-13 16:33:20