目录
在1维数组中Map和flatMap的基本用法
Map用法
基本功能:在1维数组中他俩的功能都是遍历数组,并且执行闭包{} 内的表达式,然后返回结果赋值给数组中的元素.
首先Map和flatMap都是映射,用微积分里面的东西就是 y = f(x) ,这里面的x是数组中的元素,f就是 Map和flatMap后面闭包的表达式,就是把变量进行运算的.y就是执行的结果.
y = f(x) = x+ 2
用代码来写就是
变量.map{}
let arr1 = [1,2,3,4]
let result = arr1.map { $0 + 2 }
print("result =",result)
执行结果打印:result = [3, 4, 5, 6]
高阶函数
y = f(f(x)),这个是高阶函数,也就是说把 x+2 的结果 y 再执行x+2
格式如下
变量.map{}
.map{}
代码如下:
相面代码,每次函数计算都是 x + 2
let arr1 = [1,2,3,4]
//高阶函数,连续执行map{}
let result2 = arr1.map { $0 + 2 }
.map{$0 + 2}
print("result2 =",result2)
运行结果打印:result2 = [5, 6, 7, 8]
也可以连续执行3次,高阶函数的意思就是把上次运行结果,当做下一个函数的入参继续运算
//连续执行map 3次
let result3 = arr1.map { $0 + 2 }
.map{$0 + 1}
.map{$0 * 2}
print("result3 =",result3)
运行结果:
result3 = [8, 10, 12, 14]
flatMap在1维数组中跟map运行结果一样
let arr1 = [1,2,3,4]
let result = arr1.flatMap { $0 + 2 }
print("result =",result)
运行结果打印:
result = [3, 4, 5, 6]
Map二维数组,数组维度不会改变
下面map里面第一层{$0是获取到第一个数组内的元素,是个1维数组:[1,2,3,4],然后对这个1维数组进行.map{$0 + 3},意思就是遍历1维数组这里面的每个元素,返回 + 3的值. 第一个元素就变成了 [4,5,6,7],然后遍历出第二个元素结果是[10, 11, 12]}
let arr2 = [[1,2,3,4],[7,8,9]]
let result = arr2.map { $0.map{$0 + 3}}
print("result =",result)
运行结果:result = [[4, 5, 6, 7], [10, 11, 12]]
2维数组,flatMap开始降维打击
result
let arr2 = [[1,2,3,4],[7,8,9]]
//第一层flatMap降维,到了闭包里面变成1维数组,用map和flatMap一样
//因为在flatMap { $0里面已经变成了1维数组,所以在闭包里面直接用map和flatMap没区别}
let result = arr2.flatMap { $0.map{$0 + 3}}
print("降维变成1维数组result =",result)
//因为在flatMap { $0里面已经变成了1维数组,所以在闭包里面直接用map和flatMap没区别}
let result2 = arr2.flatMap { $0.flatMap{$0 + 3}}
print("降维变成1维数组result2 =",result2)
打印结果:
降维变成1维数组result = [4, 5, 6, 7, 10, 11, 12]
降维变成1维数组result2 = [4, 5, 6, 7, 10, 11, 12]
3维数组 flatMap可以连续降维
let arr3 = [[[1,2,3,4],[7,8,9]],[[11,12,13],[15,16,17]]]
//flatMap连续2次降维,从3维变成1维
//flatMap跟Map一样,只是当出现1维以上的时候,降低一个维度
let result = arr3.flatMap { $0.flatMap{$0.map{$0 + 3}}} //从3维降到1维
print("降维变成1维数组result =",result)
//flatMap降维1次,map不降维,从3维变成2维
let result2 = arr3.flatMap { $0.map{$0.map{$0 + 3}}}//从3维降到2维(二向箔)
print("降维变成2维数组result2 =",result2)