Swift 提供了如下几个高阶函数:
map、
flatMap、
filter、
reduce。使用高阶函数进行函数式编程不仅可以简化我们的代码,而且当数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)。
一、map 函数
1,方法介绍
map 方法获取一个闭包表达式作为其唯一参数。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值。
简单说就是数组中每个元素通过某个方法进行转换,最后返回一个新的数组。
2,使用样例
(1)下面将
Int 类型数组(各个商品的金额),转换成
String 类型的数组(在金额前加上
$ 符号)
1
2
3
|
let
prices = [20,30,40]
let
strs = prices.
map
({
"$\($0)"
})
print
(strs)
|
(2)对一个数组里面的数据进行平方操作
1
2
3
|
let
values = [4, 6, 9]
let
squares = values.
map
({ $0 * $0 })
print
(squares)
|
二、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)"
)
|
(2)
flatMap 还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组。
(2)将数组转成字符串,每个元素用顿号( 、)隔开。
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)
|
四、reduce 函数
1,方法介绍
reduce 方法把数组元素组合计算为一个值,并且会接受一个初始值,这个初始值的类型可以和数组元素类型不同。
2,使用样例
(1)将数组中的金额相加,计算总和。
1
2
3
|
let
prices = [20,30,40]
let
sum = prices.reduce(0) { $0 + $1 }
print
(sum)
|
注意:上面计算总数代码还可以简化成如下代码:
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:
"、"
)
|
五、高阶函数的组合使用、链式调用
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)
|
(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)
|
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]
|