在创建Option [String]之前过滤字符串

时间:2015-03-13 13:27:43

标签: scala playframework-2.0 playframework-json

我有以下内容,其中obj是JsObject

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

如果大约是" 0"此代码将创建Some("0")。在数据库中。

如何更改它,以便在字符串为" 0"?

时创建None

1 个答案:

答案 0 :(得分: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语句执行此操作。 Play中的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
}