2016-12-07 9 views
-2

flattenとflatMap関数が正しく理解されているかどうかを確認したいと思います。flattenとflatMap in scala

1)コレクションが他のコレクションで構成されている場合にのみ、フラットが正しく動作することを修正しました。例えば、以下のリスト

//list of lists 
val l1 = List(List(1,1,2,-1,3,1,-4,5), List("a","b")) 

//list of a set, list and map 
val l2 = List(Set(1,2,3), List(4,5,6), Map('a'->"x",'b'->"y")) 

に働くだろう平らしかし、階層構造を除去することにより、すべての要素からなる新しいリストを作成します「フラット化」メソッドを

val l3 = List(1,2,3) 
val l4 = List(1,2,3,List('a','b')) 
val s1 = "hello world" 
val m1 = Map('h'->"h", 'e'->"e", 'l'->"l",'o'->"0") 

を以下では動作しません平ら。したがって、コレクションを「平坦化」し、すべての要素を同じレベルにします。

l1.flatten 
res0: List[Any] = List(1, 1, 2, -1, 3, 1, -4, 5, a, b) 

l2.flatten 
res1: List[Any] = List(1, 2, 3, 1, 5, 6, (a,x), (b,y)) 

2) 'flatMap'は、まずリストの要素にメソッドを適用し、リストを平坦化します。上に気付いたように、リストが階層(他のコレクションを含む)を持つ場合、フラット化されたメソッドが機能します。したがって、それは我々が要素に適用する方法は、コレクションを返すそうflatMapは

//we have list of lists 
val l1 = List(List(1,1,2,-1,3,1,-4,5), List("a","b")) 

l1 flatMap(x=>x.toSet) 
res2: List[Any] = List(5, 1, -4, 2, 3, -1, a, b) 

val l2 = List(Set(1,2,3), List(1,5,6), Map('a'->"x",'b'->"y")) 
l2.flatMap(x=>x.toSet) 
res3: List[Any] = List(1, 2, 3, 1, 5, 6, (a,x), (b,y)) 

val s1 = "hello world" 
s1.flatMap(x=>Map(x->x.toString)) 

を動作しないことが重要である我々は動作しませんでしたそのs1.flatten上に気づくが、s1.flatMapはなかったです。これは、s1.flatMapでは、String(文字)の要素をコレクションであるMapに変換するためです。したがって、文字列はMap( 'h' - > 'h')、Map( 'e' - > 'e')、Map( 'l' - > 'l')、Map 'l' - > 'l')、Map( 'o' - > 'o')....)こうしてflattenが動作します。作成されたマップはMap( 'h' - > 'h'、 'e' - > 'e'、 'l' - > 'l'、....)ではありません。

+1

まあ – Dima

+0

を平ら基本的に続いマップ操作であり、あなたの質問はありますか? –

+0

暗黙的な質問は「私は理解しましたか?」ということです。 –

答えて

1

flattenのための完全な署名を見てみましょう:あなたが見ることができるように

def flatten[B](implicit asTraversable: (A) ⇒ GenTraversableOnce[B]): List[B] 

を、flattenは暗黙のパラメータを取ります。このパラメータは、指定されたコレクション型を平坦化する方法の規則を提供します。コンパイラーがスコープ内で暗黙的に見つけることができない場合は、明示的に指定することができます。

flattenは、そうするためのルールを提供する限り、ほとんどすべてを平坦化できます。