58

mapとのflatMap機能の違いは何Iterableですか?

4

5 に答える 5

57

上記はすべて真実ですが、便利なことがもう flatMap1つList[Option[A]]あります。これは、 の使用を超えるための重要な概念上のブレークスルーです。List[A]OptionNonenull

于 2009-06-29T20:37:49.747 に答える
44

ここにかなり良い説明があります:

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)
于 2009-06-29T20:33:13.140 に答える
8

scaladocから:

  • 地図

指定された関数fをこのiterableの各要素に適用した結果のiterableを返します。

  • flatMap

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

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

于 2009-06-29T20:38:38.247 に答える
3

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

「flatMapを検索してください」 - そこには本当に良い説明があります。(基本的には、「フラット化」と「マップ」の組み合わせです。他の言語の機能です)。

于 2009-06-29T19:21:36.250 に答える