swift .map和.flatmap

map 简介

首先,咱们说说 map 函数如何使用

let numbers = [1,2,3,4]

let result = numbers.map { $0 + 2 }

print(result)  // [3,4,5,6]

map 方法接受一个闭包作为参数, 然后它会遍历整个 numbers 数组,并对数组中每一个元素执行闭包中定义的操作。 相当于对数组中的所有元素做了一个映射。 比如咱们这个例子里面的闭包是讲所有元素都加 2 。 这样它产生的结果数据就是 [3,4,5,6]。

例如:let stringResult = numbers.map { "No. \($0)" }

// ["No. 1", "No. 2", "No. 3", "No. 4"]

flatMap

map 可以对一个集合类型的所有元素做一个映射操作。 那么 flatMap 呢?

让我们来看一个 flatMap 的例子:

result = numbers.flatMap { $0 + 2 }

// [3,4,5,6]

我们对同样的数组使用 flatMap 进行处理, 得到了同样的结果。 那 flatMap 和 map 到底有什么区别呢?

咱们再来看另一个例子:

let numbersCompound = [[1,2,3],[4,5,6]];

var res = numbersCompound.map { $0.map{ $0 + 2 } }

// [[3, 4, 5], [6, 7, 8]]

var flatRes = numbersCompound.flatMap { $0.map{ $0 + 2 } }

// [3, 4, 5, 6, 7, 8]

这里就看出差别了。 对于二维数组, map 和 flatMap 的结果就不同了。 我们先来看第一个调用:

var res = numbersCompound.map { $0.map{ $0 + 2 } }

// [[3, 4, 5], [6, 7, 8]]

numbersCompound.map { ... } 这个调用实际上是遍历了这里两个数组元素 [1,2,3] 和 [4,5,6]。 因为这两个元素依然是数组,所以我们可以对他们再次调用 map 函数:$0.map{ $0 + 2 }。 这个内部的调用最终将数组中所有的元素加 2。

再来看看 flatMap 的调用:

var flatRes = numbersCompound.flatMap { $0.map{ $0 + 2 } }

// [3, 4, 5, 6, 7, 8]

flatMap 依然会遍历数组的元素,并对这些元素执行闭包中定义的操作。 但唯一不同的是,它对最终的结果进行了所谓的 “降维” 操作。 本来原始数组是一个二维的, 但经过 flatMap 之后,它变成一维的了。

你可能感兴趣的:(swift .map和.flatmap)