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

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s