map
のflatMap
関数とIterable
関数の違いは何ですか?
これはかなり良い説明です:
http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
例としてリストを使用:
マップの署名は次のとおりです。
map [B](f : (A) => B) : List[B]
そしてflatMapは
flatMap [B](f : (A) => Iterable[B]) : List[B]
したがって、flatMapはタイプ[A]を取り、反復可能なタイプ[B]を返し、マップはタイプ[A]を取り、タイプ[B]を返します。
これにより、flatmapがリストを「フラット化」するというアイデアも得られます。
val l = List(List(1,2,3), List(2,3,4))
println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))
println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)
上記はすべて当てはまりますが、便利なことがもう1つあります。flatMap
がList[Option[A]]
からList[A]
、Option
にドリルダウンするNone
は削除されました。これは、null
の使用を超えた重要な概念の進歩です。
lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words
あなたは理解のためにこれをよりよく見ることができます:
for {line <- lines
Word <- line split "\\W+"}
yield Word.length
これは次のように変換されます:
lines.flatMap(line => line.split("\\W+").map(Word => Word.length))
For内の各イテレータは「flatMap」に変換されますが、最後のイテレータは「map」に変換されます。このようにして、ネストされたコレクション(何とか何とか何とかバッファの配列のリスト)を返す代わりに、フラットなコレクションを返します。生成される要素によって形成されるコレクション-この場合は整数のリスト。
scaladoc から:
指定された関数fをこの反復可能オブジェクトの各要素に適用した結果の反復可能オブジェクトを返します。
指定された関数fをこの反復可能オブジェクトの各要素に適用し、結果を連結します。
ここを見てください: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
「flatMapの検索」-そこには非常に良い説明があります。 (基本的には、「平坦化」と「マップ」の組み合わせです-他の言語の機能です)。