【问题标题】:compactMap vs flatMap, Swift [duplicate]compactMap vs flatMap,Swift [重复]
【发布时间】:2019-05-22 03:42:27
【问题描述】:

谁能描述 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时嵌套数组没有展平?

【问题讨论】:

  • 它们没有被重命名。有2个,因为它们不同。以前,根据对象是否是可选的,将使用 2 个重载中的哪一个是不明确的。这在某些情况下造成了很大的混乱。底线:不,紧凑地图不仅仅是平面地图的重命名,而是平面地图中的一项功能的重命名。
  • 看看here

标签: swift functional-programming


【解决方案1】:

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

【讨论】:

  • 实际上有 3 种变体。 Optional<T> 上还有一个也没有变化。
  • @Sulthan 是的。我只是指与序列相关的flatMap 变体。我更新了我的答案以反映这一点。
  • 我很抱歉吹毛求疵。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 2019-08-24
  • 2019-10-10
  • 2018-07-07
  • 2020-04-08
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
相关资源
最近更新 更多