0

CompactMap vs FlatMap trong Swift

CompactMap:

Method này được sử dụng khi bạn muốn chuyển một array có chứa optinal values sang một array khác không chưa optional values nào (chỉ chứa các non-optional values).

Chúng ta có thể dễ dạng nhận ra sự khác biệt giữa compactMapmap thông qua ví dụ dưới đây:

let numbers = ["1", "2", "three", "///4///", "5"]

let mapped: [Int?] = numbers.map { str in Int(str) }
// ~> [1, 2, nil, nil, 5]

let compactMapped: [Int] = numbers.compactMap { str in Int(str) }
// ~> [1, 2, 5]

Độ phức tạp: O(m + n) với n là độ dài của chuỗi này và m là độ dài của kết quả

FlatMap:

Method này được sử dụng khi bạn muốn trả về một array được làm phẳng (chuyển từ 2 chiều sang 1 chiều). Thật ra flatMap còn có thể thực thi vai trò y hệt compactMap là loại bỏ các phần tử nil (chỉ chứa các non-optional values) nhưng nó bị Apple cho deprecated(không dùng nữa) mà thay bằng compactMap.

Cùng xem ví dụ bên dưới để hiểu thêm nhé:

  • Làm phẳng array: theo như mình đọc Apple docs thì flatMap thật ra chính là việc bạn map 1 collection hay sequence rồi sau đó .joined()
let numbers = [1, 2, 3, 4]

let mapped = numbers.map { Array(repeating: $0, count: $0) }
// ~> [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// ~> [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
  • filter nil (deprecated)
var myArr = [1, 2, 3, 4, nil, 8, 9]
let a = myArr.flatMap { $0 }
// ~> [1, 2, 3, 4, 8, 9]

Ngoài ra thì mình đọc qua còn thấy nhiều bạn xài flatMap để parse data sang model.

  • Init method
fileprivate struct Car {
    let id: Int
    let name: String
    let model: String
    
    init?(dictionary: [String:Any]) {
        guard
        let id = dictionary["id"] as? Int,
        let name = dictionary["name"] as? String,
        let model = dictionary["model"] as? String
        else {
            return nil
        }
        self.id = id
        self.name = name
        self.model = model
    }
}
var myCars = dictionaries.flatMap(Car.init)

Bài viết tới đây là hết. Qua bài viết mình mong rằng các bạn sẽ nắm được khác nhau giữa compactMapflatMap và cũng như là map.

Tài liệu tham khảo mình đã xem ở đây:


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí