2015-03-13 57 views
3

之前過濾字符串我有以下其中obj爲JsObject創建選項[字符串]

val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String] 

該代碼將創建一個Some("0")如果大約件是「0」在數據庫中。

如何更改它,以便在字符串爲「0」時創建None

+0

一些( 「0」)flatMap(X =>如果(X == 「0」)沒有限制其他一些(X)) – Maxim 2015-03-13 16:33:20

回答

8

如果你已經有一個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 
} 
+0

只有一個選擇是做什麼的OP要求 - 他們要求無,當0,而不是過濾,我猜想導致一個zip。 – 2015-03-13 13:53:27

+0

@EdStaub當0和'Some(value)'時,這裏所有的方法都返回'None',否則我認爲這是OP想要的。如果過濾器函數返回false,則'Option'上的'filter'返回'None',就像部分函數未定義時的'collect'一樣。 – 2015-03-13 13:56:12

+1

對 - 對不起。我一直在努力提高水平,有一系列的選項,並預計;-)。 – 2015-03-13 14:00:29