Scala flatmap() 我該怎麼寫?畫圖幫你搞懂 faltten 和 flatmap。

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章