在 scala 中展平和 flatMap
flatten and flatMap in scala
我想检查一下我是否正确理解了 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")
'flatten' 方法将通过删除层次结构来创建一个包含所有元素的新列表。因此,它有点像 'flattens' 集合,并将所有元素置于同一级别。
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' 首先将方法应用于列表的元素,然后展平列表。正如我们在上面注意到的,如果列表具有层次结构(包含其他集合),则 flatten 方法有效。因此,重要的是我们将方法应用于元素 returns 集合,否则 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").....) 这样压平就可以了现在。注意创建的Map不是Map('h'->"h", 'e'->"e", 'l'->"l",.. ..).
查看 flatten
的完整签名:
def flatten[B](implicit asTraversable: (A) ⇒ GenTraversableOnce[B]): List[B]
如您所见,flatten
采用隐式参数。该参数提供了如何展平给定集合类型的规则。如果编译器在范围内找不到隐含的,则可以显式提供。
flatten
几乎可以展平任何东西,只要您提供这样做的规则。
Flatmap 基本上是一个 map 操作,然后是 flatten
我想检查一下我是否正确理解了 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")
'flatten' 方法将通过删除层次结构来创建一个包含所有元素的新列表。因此,它有点像 'flattens' 集合,并将所有元素置于同一级别。
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' 首先将方法应用于列表的元素,然后展平列表。正如我们在上面注意到的,如果列表具有层次结构(包含其他集合),则 flatten 方法有效。因此,重要的是我们将方法应用于元素 returns 集合,否则 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").....) 这样压平就可以了现在。注意创建的Map不是Map('h'->"h", 'e'->"e", 'l'->"l",.. ..).
查看 flatten
的完整签名:
def flatten[B](implicit asTraversable: (A) ⇒ GenTraversableOnce[B]): List[B]
如您所见,flatten
采用隐式参数。该参数提供了如何展平给定集合类型的规则。如果编译器在范围内找不到隐含的,则可以显式提供。
flatten
几乎可以展平任何东西,只要您提供这样做的规则。
Flatmap 基本上是一个 map 操作,然后是 flatten