首页 > 解决方案 > compactMap 与 flatMap,Swift

问题描述

谁能描述 flatMap 与 compactMap 的这种行为?compactMap 不是刚刚重命名为 flatMap 吗?因为我发现了一个他们表现不同的案例

struct Person {
  let cars: [String]?
  let name: String
  let surname: String
  let age: Int
}

let people = [
  Person(cars: nil, name: "Adam", surname: "Bayer", age: 19),
  Person(cars: ["Audi","BMW"], name: "Michael", surname: "Knight", age: 40),
  Person(cars: ["BMW", "Mercedes", "Audi"], name: "Freddy", surname: "Krueger", age: 62)
]

let flatCars = people.flatMap { $0.cars }.flatMap { $0 }
let flatCompactCars = people.flatMap { $0.cars }.compactMap { $0 }

let compactFlatCars = people.compactMap { $0.cars }.flatMap { $0 }
let compactCars = people.compactMap { $0.cars }.compactMap { $0 }

这就是它打印的内容

flatMap flatMap:        ["Audi", "BMW", "BMW", "Mercedes", "Audi"]
flatMap compactMap:     [["Audi", "BMW"], ["BMW", "Mercedes", "Audi"]]
compactMap flatMap:     ["Audi", "BMW", "BMW", "Mercedes", "Audi"]
compactMap compactMap:  [["Audi", "BMW"], ["BMW", "Mercedes", "Audi"]]

谁能告诉我为什么当我使用compactMap嵌套数组时没有展平?

标签: swiftfunctional-programming

解决方案


曾经有两个不同的函数命名flatMap为序列;一种用于过滤掉 nil 值,一种用于连接序列。现在,其中一个nil变体)已重命名为compactMap


推荐阅读