我想检查我是否已经正确地理解了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”,....)。
嗯....是啊... – Dima
而你的问题是什么? –
隐含的问题是'我理解了'平坦和flatMap是否正确?' –