3

私は obj が a である次のものを持っていますJsObject:

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

このコードはSome("0")、データベースで約ピースが「0」の場合に を作成します。

None文字列が「0」のときに作成するように変更するにはどうすればよいですか?

4

1 に答える 1

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または、ステートメントを使用してこれを行うこともできます。JsValuePlay のすべてのサブタイプには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
}
于 2015-03-13T13:40:38.440 に答える