scalaのList#地図前List#flatMap
-
21-08-2019 - |
質問
の違いは何ですか、 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
を使用して超えて取得するための重要な概念画期的な製品です。
から scaladoc:
- 地図
のlistを返しますよ からの適用指定された関数fへ 各要素をこのlist.
- flatMap
適用され、指定された関数f 各要素をこのlistし concatenates。
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))
のための内部の各反復子は、「マップ」に変換されます、最後の1、除いて、「flatMap」に変換されます。この方法では、代わりに、ネストされたコレクション(何とか、何とか、何とかのバッファの配列のリスト)を返す、あなたはフラットなコレクションを返します。 yield'edされる要素によって形成されたコレクション - この場合の整数のリスト、
。はこちらを参照してください:http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
"検索flatMap"が本当に良い説明があります。(基本的に組み合わせた"カーブを平坦化"と"地図"--特徴からその他の言語).