数组的高级操作

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

一、map 函数

1,方法介绍

map 方法获取一个闭包表达式作为其唯一参数。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值。

简单说就是数组中每个元素通过某个方法进行转换,最后返回一个新的数组。

2,使用样例

(1)下面将Int 类型数组(各个商品的金额),转换成String 类型的数组(在金额前加上符号)

letprices = [20,30,40]

letstrs = prices.map({ "$\($0)"})

print(strs)

(2)对一个数组里面的数据进行平方操作

letvalues = [4, 6, 9]

letsquares = values.map({ $0 * $0 })

print(squares)

二、flatMap 函数

1,方法介绍

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

2,使用样例

(1)下面比较map flatMap 这两个方法

letarray = ["Apple", "Orange", "Grape", ""]


letarr1 = array.map{ a -> Int? in

    letlength = a.count

    guard length > 0 else{ returnnil}

    returnlength

}

print("arr1:\(arr1)")


letarr2 = array.flatMap { a-> Int? in

    letlength = a.count

    guard length > 0 else{ returnnil}

    returnlength

}

print("arr2:\(arr2)")

(2)flatMap 还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组。

letarray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

letarr1 = array.map{ $0 }   // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

letarr2 = array.flatMap{ $0 } // [1, 2, 3, 4, 5, 6, 7, 8, 9]

三、filter 函数

1,方法介绍

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

2,使用样例

(1)筛选出金额大于25 的元素。

letprices = [20,30,40]

letresult = prices.filter({ $0 > 25 })

print(result)

四、reduce 函数

1,方法介绍

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

2,使用样例

(1)将数组中的金额相加,计算总和。

letprices = [20,30,40]

letsum = prices.reduce(0) { $0 + $1 }

print(sum)

注意:上面计算总数代码还可以简化成如下代码:

    letsum = prices.reduce(0, +)

(2)将数组转成字符串,每个元素用顿号()隔开。

letarray = ["Apple", "Orange", "Grape"]

letstr = array.reduce("", {

    return$0 == ""? $1 : $0 + "、"+ $1

})

print(str)


//上面等效与

letstr = array.joined(separator: "、")

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

1,组合使用

(1)flatMap 配合filter 将多维整型数组里面的偶数筛选出来并且组合成了一个一维数组。

letcollections = [[5,2,7],[4,8],[9,1,3]]

letonlyEven = collections.flatMap {

    $0.filter{ $0 % 2 == 0 }

}

print(onlyEven)

(2)map 配合reduce 计算二维数组里每个分组的总和。

letcollections = [[5,2,7],[4,8],[9,1,3]]

letsums = collections.map({ $0.reduce(0, +) })

print(sums)

2,链式组合

(1)将数组中大于7的所有数字进行求和操作。

letmarks = [4,5,8,2,9,7]

lettotalPass = marks.filter{$0 > 7}.reduce(0,+) //17


(2)对某一个数组里面的数字进行平方操作然后再筛选出偶数值。

letnumbers = [4,5,8,2,9,7]

letevenSquares = numbers.map{$0 * $0}.filter{$0 % 2 == 0} //[16, 64, 4]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容