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