之前过滤字符串我有以下其中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