3-3.【函数式编程】解释 flatMap 在可选类型和数组中的行为差异,并给出示例。

2 阅读1分钟

1️⃣ flatMap 在数组中的行为

  • 作用:将嵌套数组“拍平”,或将元素映射成数组后自动扁平化。

  • 特点

    • 类似于 map,但结果会“扁平化一层”
    • 返回一个单层数组,不会出现嵌套数组

示例 1:普通数组扁平化

let nestedArray = [[1, 2], [3, 4], [5]]
let flattened = nestedArray.flatMap { $0 }
print(flattened) // [1, 2, 3, 4, 5]

示例 2:数组映射后再扁平化

let numbers = [1, 2, 3]
let result = numbers.flatMap { Array(repeating: $0, count: $0) }
print(result) // [1, 2, 2, 3, 3, 3]
  • 这里 map 会返回 [[1], [2,2], [3,3,3]]
  • flatMap 会把嵌套数组拍平成 [1,2,2,3,3,3]

2️⃣ flatMap 在可选类型中的行为

  • 作用:用于可选类型链式操作,可以避免双层可选值

  • 特点

    • 如果可选为 nil,返回 nil
    • 如果可选有值,闭包返回值直接解包
    • 常用于从一个可选生成另一个可选,并“扁平化”

示例 1:可选值映射

let number: Int? = 5
let result = number.flatMap { $0 > 3 ? $0 * 2 : nil }
print(result) // Optional(10)
  • 如果用 map,结果会是 Optional(Optional(10))
  • flatMap 会去掉多余的嵌套层

示例 2:可选链式调用

let str: String? = "123"
let number = str.flatMap { Int($0) }
print(number) // Optional(123)
  • map 会返回 Optional(Optional(123)),需要再解包一次
  • flatMap 自动“扁平化”,直接得到 Optional(123)

3️⃣ 总结区别

方面数组 flatMap可选 flatMap
作用扁平化嵌套数组或映射数组链式操作可选值,去掉多层 Optional
返回值单层数组单层 Optional
常用场景将嵌套数组变成一维数组,或者映射产生数组后展开避免可选嵌套,链式处理可选值

💡 记忆技巧

  • 数组 flatMap = 扁平化数组
  • 可选 flatMap = 扁平化 Optional