Swift - 高阶函数介绍(map、flatMap、filter、reduce)

时间:2022-06-24 18:28:06
Swift 提供了如下几个高阶函数: mapflatMapfilterreduce。使用高阶函数进行函数式编程不仅可以简化我们的代码,而且当数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)。

一、map 函数

1,方法介绍

map 方法获取一个闭包表达式作为其唯一参数。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值。
简单说就是数组中每个元素通过某个方法进行转换,最后返回一个新的数组。

2,使用样例

(1)下面将  Int 类型数组(各个商品的金额),转换成  String 类型的数组(在金额前加上  符号)
1
2
3
let  prices = [20,30,40]
let  strs = prices. map ({  "$\($0)"  })
print (strs)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

(2)对一个数组里面的数据进行平方操作
1
2
3
let  values = [4, 6, 9]
let  squares = values. map ({ $0 * $0 })
print (squares)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

二、flatMap 函数

1,方法介绍

flatMap 方法同  map 方法比较类似,只不过它返回后的数组中不存在  nil(自动把  nil 给剔除掉),同时它会把  Optional 解包。

2,使用样例

(1)下面比较  map 和  flatMap 这两个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let  array = [ "Apple" "Orange" "Grape" "" ]
 
let  arr1 = array. map  { a ->  Int in
     let  length = a.count
     guard length > 0  else  return  nil  }
     return  length
}
print ( "arr1:\(arr1)" )
 
let  arr2 = array.flatMap { a->  Int in
     let  length = a.count
     guard length > 0  else  return  nil  }
     return  length
}
print ( "arr2:\(arr2)" )
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

(2) flatMap 还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组。
1
2
3
let  array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let  arr1 = array. map { $0 }    // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let  arr2 = array.flatMap{ $0 }  // [1, 2, 3, 4, 5, 6, 7, 8, 9]

三、filter 函数

1,方法介绍

filter 方法用于过滤元素,即筛选出数组元素中满足某种条件的元素。

2,使用样例

(1)筛选出金额大于  25 的元素。
1
2
3
let  prices = [20,30,40]
let  result = prices. filter ({ $0 > 25 })
print (result)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

四、reduce 函数

1,方法介绍

reduce 方法把数组元素组合计算为一个值,并且会接受一个初始值,这个初始值的类型可以和数组元素类型不同。

2,使用样例

(1)将数组中的金额相加,计算总和。
1
2
3
let  prices = [20,30,40]
let  sum = prices.reduce(0) { $0 + $1 }
print (sum)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

注意:上面计算总数代码还可以简化成如下代码:
1
let  sum = prices.reduce(0, +)

(2)将数组转成字符串,每个元素用顿号( )隔开。
1
2
3
4
5
6
7
8
let  array = [ "Apple" "Orange" "Grape" ]
let  str = array.reduce( "" , {
     return  $0 ==  ""  ? $1 : $0 +  "、"  + $1
})
print (str)
 
//上面等效与
let  str = array.joined(separator:  "、" )
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

五、高阶函数的组合使用、链式调用

1,组合使用

(1) flatMap 配合  filter 将多维整型数组里面的偶数筛选出来并且组合成了一个一维数组。
1
2
3
4
5
let  collections = [[5,2,7],[4,8],[9,1,3]]
let  onlyEven = collections.flatMap {
     $0. filter  { $0 % 2 == 0 }
}
print (onlyEven)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

(2) map 配合  reduce 计算二维数组里每个分组的总和。
1
2
3
let  collections = [[5,2,7],[4,8],[9,1,3]]
let  sums = collections. map ({ $0.reduce(0, +) })
print (sums)
Swift - 高阶函数介绍(map、flatMap、filter、reduce)

2,链式组合

(1)将数组中大于  7 的所有数字进行求和操作。
1
2
let  marks = [4,5,8,2,9,7]
let  totalPass = marks. filter {$0 > 7}.reduce(0,+)  //17

(2)对某一个数组里面的数字进行平方操作然后再筛选出偶数值。
1
2
let  numbers = [4,5,8,2,9,7]
let  evenSquares = numbers. map {$0 * $0}. filter {$0 % 2 == 0}  //[16, 64, 4]