2015-03-13 58 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