高阶函数
高阶函数的本质也是函数,有两个特点
- 接受函数或者是闭包作为参数
- 返回值是一个函数或者是闭包
Map函数
- 对集合中的所有元素进行同样的操作,并返回一个新集合
let nums = [1,2,3,4,5,6,7,8]
var mapNums = nums.map {
$0 + 1
}
print("mapNums:\(mapNums)")
flatMap函数
- 可将集合中的所有集合取出,最终变成一个新的集合
- 下面的例子是讲所有的元素进行+1操作
let numFlat = [[1,2,3,4],[8,9,7,6]]
let numsFlatMap = numFlat.flatMap {
$0
}
print("numsFlatMap:\(numsFlatMap)")
CompactMap函数
- 当集合中有
nil
存在时使用CompactMap函数
let nums = [1,2,nil,3,4,5,6,7,8,nil,nil]
let compactMapNums = nums.compactMap {
$0
}
print("compactMapNums:\(compactMapNums)")
-
CompactMap
类似于Map
函数,只是CompactMap
可以处理集合中的nil
元素
filter函数
- 对集合中的元素进行过滤,返回一个符合条件新的集合
- 下面例子是取出集合中所有小于5的元素
let nums = [1,2,3,4,5,6,7,8]
var filterNums = nums.filter {
$0 < 5
}
print("filterNums:\(filterNums)")
reduce函数
- 对集合中所有的元素进行操作,并返回一个新值
let nums = [1,2,3,4,5,6,7,8]
nums.reduce([Int]()) {
print("$0:\($0),$1:\($1)")
return $0
}
- 根据上述案例,我们先传入一个类型
[Int]()
即:数组元素为Int
-
reduce
函数传入什么类型就要返回什么类型
-
reduce
函数有两个参数,$0
为传入的类型(这里刚开始1`为集合中的元素
let nums = [1,2,3,4,5,6,7,8]
let reduceNums = nums.reduce([Int]()) {
[$1] + $0
}
print("reduceNums:\(reduceNums)")
- 上述案例是对集合进行
倒序排列
-
$1
实际是几个中的元素,所以我们需要将0`,
高阶函数链式调用
求一个数组中偶数的平方和
- 方法1
let nums = [1,2,3,4,5,6,7,8]
let numTemp = nums.filter {
$0 % 2 == 0
}.map {
$0 * $0
}.reduce(Int()) {
$0 + $1
}
print("numTemp:\(numTemp)")
这里我们先用
filter
函数过滤出偶数再将新集合中的元素进行求平方
最后将所求的平方进行相加
方法2
let nums = [1,2,3,4,5,6,7,8]
let numTemp = nums.filter {
$0 % 2 == 0
}.reduce(Int()) {
$0 + $1 * $1
}
print("numTemp:\(numTemp)")
这里我们将
map
函数的操作省略掉,直接进行求平方和
并加上前一个元素的平方和方法3
let nums = [1,2,3,4,5,6,7,8]
let numTemp = nums.reduce(Int()) {
$1 % 2 == 0 ? $0 + $1 * $1 : $0
}
print("numTemp:\(numTemp)")
- 这里直接使用
reduce
函数,进行偶数判断,并进行求平方和