map
とのflatMap
機能の違いは何Iterable
ですか?
5 に答える
上記はすべて真実ですが、便利なことがもう flatMap
1つList[Option[A]]
あります。これは、 の使用を超えるための重要な概念上のブレークスルーです。List[A]
Option
None
null
ここにかなり良い説明があります:
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] を返し、map は型 [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)
scaladocから:
- 地図
指定された関数fをこのiterableの各要素に適用した結果のiterableを返します。
- flatMap
指定された関数fをこの反復可能オブジェクトの各要素に適用してから、結果を連結します。
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 内の各反復子は、「map」に変換される最後のものを除いて、「flatMap」に変換されます。このようにして、ネストされたコレクション (何とか、何とか、何とかのバッファーの配列のリスト) を返す代わりに、フラットなコレクションを返します。生成される要素によって形成されるコレクション -- この場合は整数のリスト。
ここを見てください: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
「flatMapを検索してください」 - そこには本当に良い説明があります。(基本的には、「フラット化」と「マップ」の組み合わせです。他の言語の機能です)。