8

私はここで私を推薦したブログ投稿を読みました。今、私はそれらの方法のいくつかが何に役立つのだろうかと思います。(ではなく)との使用例を示していただけますか?forallforeachtoListOption

4

3 に答える 3

27
  • mapOption:おそらくすでにsについて知っているように、値を「内部」に変換できますList。この操作はOptionファンクターになります(同僚を怖がらせたい場合は「エンドファンクター」と言うことができます)
  • flatMapOptionは実際にはモナドであり、flatMap1つになります(単一の値のコンストラクターのようなものと一緒に)。このメソッドは、値をに変換する関数がある場合に使用できますが、持っているOption値はすでにに「ラップ」されているOptionためflatMap、関数を適用する前にラップを解除する手間が省けます。たとえば、があればOption[Map[K,V]]、と書くことができますmapOption.flatMap(_.get(key))mapここで単純なものを使用するとOption[Option[V]]、が得られますが、これを使用すると。flatMapが得られますOption[V]。この方法は、非常に柔軟な方法で関数を連鎖させることができるため、想像以上にクールです(これが、Haskellがモナドを愛する理由の1つです)。
  • flattenOption[Option[T]]:タイプの値がある場合は、flattenそれを。に変換しOption[T]ます。と同じflatMap(identity(_))です。
  • orElse:sでラップされた複数の選択肢がOptionあり、実際に値を保持する最初の選択肢が必要な場合は、これらの選択肢を次のように連鎖させることができますorElsesteakOption.orElse(hamburgerOption).orElse(saladOption)
  • getOrElse:から値を取得しますOptionが、空の場合はデフォルト値を指定します。例:nameOption.getOrElse("unknown")
  • foreach:存在する場合は、内部の値を使用して何かを実行します。
  • isDefinedisEmpty:これOptionが値を保持するかどうかを判別します。
  • forallexists:指定された述語が値に当てはまるかどうかをテストします。forallは、と同じoption.map(test(_)).getOrElse(true)ですが、デフォルトexistsと同じfalseです。
  • toList:驚いたことに、それはに変換しOptionますList
于 2011-07-26T21:50:30.743 に答える
11

Optionのメソッドの多くは、すべて非常に小さな関数であり、多くの労力を惜しまないため、有用性ではなく、(コレクションを使用した)均一性のために存在する可能性がありますが、目的を果たし、その意味は次のとおりです。コレクションフレームワークに慣れたら、クリアします(よく言われるように、Optionは複数の要素を持つことができないリストのようなものです)。

forallは、オプション内の値のプロパティをチェックします。値がない場合は、チェックに合格します。たとえば、レンタカーで許可されている場合はadditionalDriver: Option[Person]、次のことができます。

additionalDriver.forall(_.hasDrivingLicense)

複数の追加ドライバーが許可され、リストがある場合とまったく同じことです。

toListは便利な変換かもしれません。オプションがあり、List [Option [T]]であり、すべてのオプションの値がSomeであるList[T]を取得するとします。できるよ

for(option <- options; value in option.toList) yield value

(またはそれ以上options.flatMap(_.toList)

于 2011-07-26T16:38:12.467 に答える
6

方法の実際的な例が1つありtoListます。Module.scalaの72行目のscaldi(私のScala依存性注入フレームワーク)にあります。

https://github.com/OlegIlyenko/scaldi/blob/f3697ecaa5d6e96c5486db024efca2d3cdb04a65/src/main/scala/scaldi/Module.scala#L72

このコンテキストでは、メソッドはいずれか、または1つの要素のみgetBindingsを返すことができます。と同じように取得できます。メソッドを使用して(空または1つの要素を持つ)に変換できると便利だと思います。NilListOptiondiscoverBindingOptionListtoList

于 2011-07-26T16:14:42.040 に答える