一、flatten
扁平化
用公司的管理架构举例。
公司架构
总经理管理经理,经理管理员工。
如果采用扁平化管理,那么就相当于总经理直接管理员工。抽掉中间的一层。
放在List 的嵌套结构中,如果 List 中的每个元素可分,那么就可继续像下拆分。
将 List 看成树形结构,List 里的一个元素,就是一个节点,元素用逗号分隔。
扁平化的本质就是减少中间层。
也就是说,一次 flatten 就抽掉 1 层,两次 flatten 就抽掉 2 层。
抽掉中间节点,根节点最外层的集合,直接把叶子节点(最下层节点)的每个元素,当做自己的元素。
直接看例子:
val list: List[List[Int]] = List(List(1, 2), List(3, 4))
println(list.flatten) //List(1, 2, 3, 4)
val list: List[String] = List("hello scala", "hello spark")
println(list.flatten)
//结果是
//List(h, e, l, l, o, , s, c, a, l, a, h, e, l, l, o, , s, p, a, r, k)\
//因为组成字符串的基本元素是字符,因此得到上面的结果
如果我想按单词分割最后一层呢?
其实可以自定义分割规则,我们就需要给 flatten 传一个函数,最后返回的类型就是中间节点转换后的类型。
val list: List[String] = List("hello scala", "hello spark")
esult: List[String] = list.flatten((s) => {
s.split(" ").toList
})
println(result)
//List(hello, scala, hello, spark)
那如果我集合是这样呢?好像不可以扁平化。
List(1, 2, 3, 4)
其实我们还是可以通过自定义规则来实现,看代码
// 看似不可扁平化,实际可以扁平化
val list = List(1, 2, 3, 4)
val result: List[Int] = list.flatMap((num) => {
List(num * 2)
})
println(result)
//List(2, 4, 6, 8)
二、map
map 的作用是我们可以根据规则,把一个集合映射成另一个集合。
传进 map 中自定义函数的参数是集合的每个元素。集合中的一个元素调用一次 map 中的自定义函数。
看例子:
List("hello scala", "hello spark") --> List((hello,scala), (hello,spark))
val list: List[String] = List("hello scala", "hello spark")
val result: List[(String, String)] = list.map(
s => {
val strings: Array[String] = s.split(" ")
(strings(0), strings(1))
})
println(result)
//List((hello,scala), (hello,spark))
三、flatMap
flatmap 的功能就是,一次 flatten 一次 map 。 那么我们就要抽掉 2 层。 一层是 flatten 的, 一层是 map 的。
来看一个例子:
- WordCount 单词切分
val datas: List[(String, Int)] = List(
("hello", 4),
("hello world", 3),
("hello scala flink", 2),
("hello spark scala hive hive", 1)
)
val wordsList: List[(String, Int)] = datas.flatMap(wordsAndCount => {
wordsAndCount._1.split(" ").map(word => {
(word, wordsAndCount._2)
})
})
println(wordsList)
// List((hello,4), (hello,3), (world,3), (hello,2), (scala,2)
// , (flink,2), (hello,1), (spark,1), (scala,1), (hive,1), (hive,1))