6

以下を考えると:

val x = Some(Some(1))

1 (存在しない場合は -1) を取得する最もクリーンな方法は何でしょうか?

データベース クエリから返されたタプルからオブジェクト インスタンスを作成しています。タプルの値の 1 つがこのように見えるので、値を取得するか、パラメータを -1 に設定するだけの短い「ワン ライナー」が必要です。

4

5 に答える 5

15

x.flattenあなたが探しているものです。ここでそれはあなたに与えるでしょうSome(1)「存在しなかった-1」場合を本当に取得したい場合は、次のようにします。x.flatten.getOrElse(-1)

scala> Some(Some(1)).flatten.getOrElse(-1)
res1: Int = 1
scala> Some(None).flatten.getOrElse(-1)
res2: Int = -1
scala> None.flatten.getOrElse(-1)
res3: Int = -1
于 2013-01-17T15:53:31.927 に答える
3

for-comprehensions は、多くの場合、これらの種類のネストされた構造を使用するための非常に読みやすい方法です。

  val x = Some(Some(1))
  val result = for {
    firstLevel <- x
    secondLevel <- firstLevel
  } yield {
    // We've got an int, now transform it!
    (secondLevel * 100).toString
  }

結果は Option[String] で、変換は Some(s) が 2 つある場合にのみ発生します。

パターン マッチングを使用することもできます。

  val result2 = for {
    Some(v) <- x
  } yield {
    // We've got a int, now transform it!
    (v * 100).toString
  }
于 2013-01-17T17:49:40.317 に答える
2

「ワンライナー」ではありませんが、値を抽出する関数を作成できます。汎用にしてデフォルト値を渡すと、かなり便利な場合があります。

scala> def fetchFromOptions[A](default: A)(x: Option[Option[A]]) = x match {
     | case Some(Some(a)) => a
     | case _ => default
     | }
fetchFromOptions: [A](default: A)(x: Option[Option[A]])A

scala> fetchFromOptions(-1)(Some(Some(1)))
res0: Int = 1

scala> fetchFromOptions(-1)(Some(None))
res1: Int = -1
于 2013-01-17T16:16:36.430 に答える
1

その が実際にわかっている場合Some(Some(1))は、反論の余地のないパターン マッチ表記法を使用できます。

scala> val ssi1 = Some(Some(1))
ssi1: Some[Some[Int]] = Some(Some(1))

scala> val Some(Some(i1)) = ssi1
i1: Int = 1

可能性のあるものがNone混在している可能性がある場合は、他の人が提案したより慎重で冗長な形式を使用する必要があります。

これが奇妙な表記法だと思う人は、それを構文またはリテラルcaseの a に書き込んで、検査対象の.matchPartialFunctionSome(Some(1))

于 2013-01-17T17:03:40.720 に答える
1

これは私が思いついたものです:

scala> val x = Some(Some(1))
x: Some[Some[Int]] = Some(Some(1))

scala> val y = x.map(_.getOrElse(-1)).get
y: Int = 1

scala> val x = Some(None)
x: Some[None.type] = Some(None)

scala> val y = x.map(_.getOrElse(-1)).get
y: Int = -1

これは、最初のレベルの SomeNoneでない場合にのみ機能します

于 2013-01-17T16:04:08.153 に答える