compactMap vs flatMap,Swift

compactMap vs flatMap,Swift,swift,functional-programming,Swift,Functional Programming,有人能描述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),

有人能描述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
嵌套数组时不平坦吗?

对于序列,过去有两个不同的函数名为
flatMap
;一个用于过滤掉nil值,另一个用于连接序列。现在,其中一个(nil的
nil
变体)被重命名为
compactMap
,过去有两个不同的函数,分别命名为
flatMap
;一个用于过滤掉nil值,另一个用于连接序列。现在,其中一个(nil变体)已重命名为
compactMap

,但尚未重命名。有两种,因为它们不同。以前,根据对象是否可选,这两个重载中的哪一个将被使用是不明确的。这在某些情况下造成了极大的混乱。一句话:不,compact map不仅仅是对flat map的重命名,而是对flat map中以前的功能之一的重命名。请看,它们还没有被重命名。有两种,因为它们不同。以前,根据对象是否可选,这两个重载中的哪一个将被使用是不明确的。这在某些情况下造成了极大的混乱。一句话:不,compact map不仅仅是对flat map的重命名,而是对flat map中曾经使用的功能之一的重命名。看一看,实际上有3种变体。
Optional
上还有一个也没有改变。@Sulthan是这样的。我只是指序列相关的
flatMap
变体。我更新了我的答案以反映这一点。我为吹毛求疵道歉。实际上有3种变体。
Optional
上还有一个也没有改变。@Sulthan是这样的。我只是指序列相关的
flatMap
变体。我更新了我的答案以反映这一点。我为吹毛求疵道歉。