CompactMap vs flatMap

直接從 code 來看兩者之間和 map 的差異

CompactMap

let scores = ["1", "2", "3", "four", "5"]
let mapped: [Int?] = scores.map { str in Int(str) }
// [1, 2, 3, nil, 5] 
let compactMapped: [Int] = scores.compactMap { str in Int(str) }
// [1, 2, 3, 5]

flatMap

let users = [User(name: "Archie", scores: [1, 2, 4]), User(name: "ArchieChang", scores: [3,2,5])]
let mapped = users.map { $0.scores }
// [[1, 2, 4], [3, 2, 5]]
let flatMapped = users.flatMap { $0.scores }
// [1, 2, 4, 3, 2, 5]

在使用情境上,CompactMap 可以將 nil 給過濾掉,使得回傳的陣列為 non optional 的型態;

原先還在使用 map + filter 來處理 nil 的部分,可以直接使用 CompactMap 處理,減少多一次的陣列迴圈。

而 flatMap 則是在將所有陣列的內容整合進同一個陣列,如我們需要計算全體使用者的總得分時,便可以先將個別使用者的分數集結成一個陣列來處理。

comments powered by Disqus