本文已参与新人创作礼活动,一起开启掘金创作之路。
什么是高阶函数
如果一个函数:
- 接收一个或多个函数当作参数
- 把一个函数当作返回值
至少满足以上条件中的一个的函数,那么这个函数就被称作高阶函数。
使用高阶函数进行函数式编程的优势:
- 简化代码
- 使逻辑更加清晰
- 当数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)
swift有哪些高阶函数
map、flatMap、compactMap、filter、reduce。
map
数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组
a. 需求:将Int类型数组中的元素乘以2,然后转换为String类型的数组
**
let ints = [1, 2, 3, 4]
let strs = ints.map { "($0 * 2)" }
// 打印结果:["2", "4", "6", "8"]
print(strs)
b. 需求:生成一个新的Int数组,元素是多少元素就重复多少个
**
let nums = [1, 2, 3, 4]
let mapNums = nums.map { Array(repeating: $0, count: $0) }
// 打印结果:[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
print(mapNums)
最终返回的是一个二维数组。
c. 需求:将String类型的数组转换为Int类型的数组
**
let someAry = ["12", "ad", "33", "cc", "22"]
// var nilAry: [Int?]
let nilAry = someAry.map { Int($0) }
// 打印结果:[Optional(12), nil, Optional(33), nil, Optional(22)]
print(nilAry)
最终返回的是[Int?],一个可选类型的Int数组,且元素中存在nil。
flatMap
flatMap的实现与map非常类似,也是数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组。
不过flatMap能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组,称为降维,通俗一点就是把多维数组都会拍扁为一维数组,通过后面的例子一看就明白了。
flatMap另一个解包的功能在 4.1 版本之后更名为compactMap,所以在compactMap再做说明。
a. 需求:将Int类型数组中的元素乘以2,然后转换为String类型的数组
**
let ints = [1, 2, 3, 4]
let strs = ints.flatMap { "($0 * 2)" }
// flatMap打印结果:["2", "4", "6", "8"]
print(strs)
该例子使用的与map一样,结果也是一样的,普通情况下,两者的效果一致。
b. 需求:生成一个新的Int数组,元素是多少元素就重复多少个
**
let nums = [1, 2, 3, 4]
let mapNums = nums.flatMap { Array(repeating: $0, count: $0) }
// flatMap打印结果:[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
print(mapNums)
可以看到,flatMap把数组中的数组都打开了,最终返回的是一个一维数组。而map返回的是一个二维数组,没有降维。
compactMap
compactMap是在4.1之后对flatMap的一个重载方法的重命名,同样是数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组,不过compactMap会将nil剔除,并对Optional进行解包。
a. 需求:将String类型的数组转换为Int类型的数组
**
var someAry = ["12", "ad", "33", "cc", "22"]
// var compactMapAry: [Int]
var compactMapAry = someAry.compactMap { Int($0) }
// compactMap打印结果:[12, 33, 22]
print(compactMapAry)
最终返回的是[Int],一个Int数组,并将其中转换失败的nil过滤掉了,并对转换成功的Optional值进行了解包。
filter
filter用来过滤元素,即筛选出数组元素中满足某种条件(闭包实现) 的元素。
a. 需求:筛选出Int数组中的偶数
**
let nums = [1, 13, 12, 36, 77, 89, 96]
let result = nums.filter { $0 % 2 == 0 }
// 打印结果:[12, 36, 96]
print(result)
最终返回的是全部是偶数的Int数组。
reduce
计算,可以对数组的元素进行计算