15

リストがl:List[T1]あり、現在次のことを行っています。

myfun : T1 -> Option[T2]
val x: Option[T2] = l.map{ myfun(l) }.flatten.find(_=>true)

このmyfun関数は None または Some を返し、 flatten はすべての None を破棄し、 find はリストの最初の要素があればそれを返します。

これは私には少しハッキーに思えます。私は、これを少し無駄が少なく、より賢くするための理解などがあるかもしれないと考えています。例: list の実行中にanymyfunが返された場合、その後の回答は必要ありません。 Somemapl

4

5 に答える 5

13

どうですか:

l.toStream flatMap (myfun andThen (_.toList)) headOption

Stream は怠惰なので、事前にすべてをマップするわけではありませんが、再マップすることもありません。ものを平らにする代わりに、使用できるように変換Optionします。ListflatMap

于 2010-09-04T22:52:51.447 に答える
4

を使用toStreamして検索を遅延させることに加えて、次を使用できますStream::collectFirst

List(1, 2, 3, 4, 5, 6, 7, 8).toStream.map(myfun).collectFirst { case Some(d) => d }
// Option[String] = Some(hello)
// given def function(i: Int): Option[String] = if (i == 5) Some("hello") else None

これ:

  • 検索を早期に停止するためにList、 を に変換します。Stream

  • myFunasを使用して要素を変換しますOption[T]

  • そうでない最初のマップされた要素を収集してNone抽出します。

sを支持して s をScala 2.13非推奨にすることから、これは次のようになります。StreamLazyList

List(1, 2, 3, 4, 5, 6, 7, 8).to(LazyList).map(function).collectFirst { case Some(d) => d }
于 2018-10-02T00:10:58.450 に答える
3

まあ、これはほとんどですが、完全ではありません

val x = (l flatMap myfun).headOption

しかし、あなたはmyfun からOptionではなく aを返しListているので、これはうまくいかないかもしれません。もしそうなら(私はREPLを手に入れていません)、代わりに試してください:

val x = (l flatMap(myfun(_).toList)).headOption
于 2010-09-04T22:14:18.577 に答える
2

まあ、理解のための同等物はかなり簡単です

(for(x<-l, y<-myfun(x)) yield y).headOption

これは、実際に翻訳を行うと、oxbow_lakes が提供したものと同じように機能します。List.flatmap の合理的な遅延を想定すると、これはクリーンで効率的なソリューションです。

于 2010-09-04T22:15:20.337 に答える