2016-12-07 92 views
-2

我想檢查我是否已經正確地理解了flatten和flatMap的功能。在斯卡拉flatten和flatMap

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」),地圖('o' - >「o」)....)現在這樣變平。請注意,所創建的地圖不是Map('h' - >「h」,'e' - >「e」,'l' - >「l」,....)。

+1

嗯....是啊... – Dima

+0

而你的問題是什麼? –

+0

隱含的問題是'我理解了'平坦和flatMap是否正確?' –

回答

1

看看完整的簽名flatten

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

正如你所看到的,flatten需要一個隱含的參數。該參數提供瞭如何平鋪給定集合類型的規則。如果編譯器無法在範圍內找到隱式,則可以明確提供它。

flatten只要您提供規則,就可以使任何東西變平。

0

Flatmap基本上是一個地圖操作,後跟扁平