一、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))