学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

Swift高阶函数 Map,Flatmap,Filter,Reduce的用法

高阶函数 Map,Flatmap,Filter,Reduce的用法

Map

map:map方法作用是把数组[T]通过闭包函数把每一个数组中的元素变成U类型的值,最后组成数组[U]。

定义如下:

func map(transform: (T) -> U) -> [U]

1
2
3
4
5
6
7
8
9
func map<T, U>(xs: [T], f: T -> U) -> [U]
{
var result: [U] = []
for x in xs
{
result.append(f(x))
}
return result
}

将示例数组,每个数字都加10,获得一个新的数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//map函数里面可以直接使用函数作为参数,这里采用函数的方式。
let numberArray = [1,2,3,4,5]

func fmap(a : Int) -> Int{
return a + 10
}

var result = numberArray.map(fmap)

print(result)

//采用闭包的方式
var result = numberArray.map({($0) + 10})
print(result)

map不只是可以用来做简单的数值运算,还可以处理一些其他复杂操作,如:在数字后拼接字符串,返回新的数组

1
2
resultArray = numberArray.map({"\($0)只"})
print(resultArray)

FlatMap

flatMap 更加强大,可以传入N个处理方法,将处理后得到数据,组合到同一个数组中

1
2
3
4
5
resultArray = numberArray.flatMap({["\($0)个","\($0 )只"]})
print(resultArray)
//输出结果:

["1个", "1只", "2个", "2只", "3个", "3只", "4个", "4只", "5个", "5只"]

Filter

filter就是筛选的功能,参数是一个用来判断是否筛除的筛选闭包,根据闭包函数返回的Bool值来过滤值。为True则加入到结果数组中。定义如下:
func filter(includeElement: (T) -> Bool) -> [T]

找出数组中大于2的数

1
2
3
var filteredArray : [Int] = []
filteredArray = numberArray.filter({$0 > 2})
print(filteredArray)

reduce

reduce的作用给定一个类型为U的初始值,把数组[T]中每一个元素传入到combine的闭包函数里面,通过计算得到最终类型为U的结果值。

定义如下:

func reduce(initial: U, combine: (U, T) -> U) -> U

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func reduce<A, R>(arr: [A], _ initialValue: R, combine: (R, A) -> R) -> R
{
var result = initialValue
for i in arr
{
result = combine(result, i)
}
return result
}

let input = [1, 2, 3, 4]

var sum = reduce(input, 0){ x, y in x + y }

计算数组中所有数字的和,积

1
2
3
var sum = 0
sum = numberArray.reduce(0, combine: {$0 + $1})
print(sum)