Swift高阶函数map、flatMap、CompactMap 、filter 、reduce

高阶函数

高阶函数的本质也是函数,有两个特点

  • 接受函数或者是闭包作为参数
  • 返回值是一个函数或者是闭包

Map函数

  • 对集合中的所有元素进行同样的操作,并返回一个新集合
let nums = [1,2,3,4,5,6,7,8]
var mapNums = nums.map {
    $0 + 1
}
print("mapNums:\(mapNums)")
image.png

flatMap函数

  • 可将集合中的所有集合取出,最终变成一个新的集合
  • 下面的例子是讲所有的元素进行+1操作
let numFlat = [[1,2,3,4],[8,9,7,6]]
let numsFlatMap = numFlat.flatMap {
 $0
}
print("numsFlatMap:\(numsFlatMap)")

image.png

CompactMap函数

  • 当集合中有nil存在时使用CompactMap函数
let nums = [1,2,nil,3,4,5,6,7,8,nil,nil]
let compactMapNums = nums.compactMap {
    $0
}
print("compactMapNums:\(compactMapNums)")
image.png
  • 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
}

image.png
  • 根据上述案例,我们先传入一个类型[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)")

image.png
  • 上述案例是对集合进行倒序排列
  • $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函数,进行偶数判断,并进行求平方和

你可能感兴趣的:(Swift高阶函数map、flatMap、CompactMap 、filter 、reduce)