web-dev-qa-db-ja.com

scala Iterable#map vs. Iterable#flatMap

mapflatMap関数とIterable関数の違いは何ですか?

58
Landon Kuhn

これはかなり良い説明です:

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)
44
agilefall

上記はすべて当てはまりますが、便利なことがもう1つあります。flatMapList[Option[A]]からList[A]OptionにドリルダウンするNoneは削除されました。これは、nullの使用を超えた重要な概念の進歩です。

55
kikibobo
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」に変換されます。このようにして、ネストされたコレクション(何とか何とか何とかバッファの配列のリスト)を返す代わりに、フラットなコレクションを返します。生成される要素によって形成されるコレクション-この場合は整数のリスト。

8

scaladoc から:

  • 地図

指定された関数fをこの反復可能オブジェクトの各要素に適用した結果の反復可能オブジェクトを返します。

  • flatMap

指定された関数fをこの反復可能オブジェクトの各要素に適用し、結果を連結します。

8
skaffman

ここを見てください: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

「flatMapの検索」-そこには非常に良い説明があります。 (基本的には、「平坦化」と「マップ」の組み合わせです-他の言語の機能です)。

3
puppetluva