在创建 Option[String] 之前过滤字符串
Filter a string before creating an Option[String]
我有以下内容,其中 obj 是 JsObject
:
val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String]
如果数据库中大约件数为“0”,此代码将创建 Some("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
语句执行此操作。 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
}
我有以下内容,其中 obj 是 JsObject
:
val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String]
如果数据库中大约件数为“0”,此代码将创建 Some("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
语句执行此操作。 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
}