4

私はfor理解とflatMapオプションに精通しています。

だから私はあなたが次のようなことができることを知っています

val a: Option[_] = for {
  foo <- Some(x)
  bar <- Some(y)
  baz <- Some(z)
} yield baz

各ステートメントで実行しているSome(z)ため、 for 内包表記に が何もない場合は、私に与えられます。NoneflatMap

しかし、実際には、逆の方法で何かを探しています。内包内の a のように、forすべてが である限り、内包までトラバースしたいと思います。NoneorElsefor

例えば:

val b: Option[_] = for {
    foo <- None
    bar <- Some(x)
    baz <- None
} yield *return the one with some*

このようなものはありますか、またはこれに最適なアプローチは何ですか?

前もって感謝します!

4

2 に答える 2

7

reducea を見つけても短絡しませんSome(つまり、最初の要素が a であっても、1000 個の要素リストは 1000 回の比較を行いますSome)。find(_.isDefined)+flattenは停止し、最初Someに見つかったものを返します。以下は、(5 回ではなく) 2 回の比較のみを行います。

val xs: List[Option[Int]] = List(None, Some(1), None, Some(2), None, Some(3))
xs.find(_.isDefined).flatten
于 2014-05-16T02:55:55.537 に答える
3

理解のためのシナリオでは、実際には意味がありません。アイテムをコレクションに入れて、None 以外を引き出すだけのほうがよいでしょう。

たぶん、このようなものですか?

val xs: List[Option[Int]] = List(None, Some(1), None)
xs.reduce(_ orElse _) // Some(1)

val ys: List[Option[Int]] = List(None, None)
ys.reduce(_ orElse _) // None
于 2014-05-15T21:29:23.583 に答える