swift中比较常用的高阶函数有:map、flatMap、filter、reduce。
使用高阶函数可以简化代码量,相对来说高阶函数实现的效率会快一些,它可以并行执行。
1.map函数
- map可以对数组中的每一个元素做一次处理,如同遍历的作用
- map 方法接受一个闭包作为参数, 然后它会遍历整个数组,并对数组中每一个元素执行闭包中定义的操作。 相当于对数组中的所有元素做了一个映射
- map 可以对一个集合类型的所有元素做一个映射操作
- map并不会修改实例值, 而是新建一个拷贝
// 1.对每一个元素进行运算
var values1 = [1,2,3,4,5]
values1 = values1.map{$0 + 10}
print(values1) // [11, 12, 13, 14, 15]
var values2 = [10,20,30]
values2 = values2.map{$0 * 10}
print(values2) // [100, 200, 300]
var values3 = [1,2,3,4,5]
values3 = values3.map ({ (element) -> Int in
return element * 10
})
print(values3) // [10, 20, 30, 40, 50]
// 2.计算每一个元素的count
let strs = ["JiB", "MotuoKe", "NiuBi", "DaHa", "DanDan"]
let counts1 = strs.map { (str) -> Int in
str.count
}
print(counts1) // [3, 7, 5, 4, 6]
let counts2 = strs.map {
$0.count
}
print(counts2) // [3, 7, 5, 4, 6]
// 3.排序
let lowers = strs.map {
$0.lowercased()
}
print(lowers) // ["jib", "motuoke", "niubi", "daha", "dandan"]
// 4.数组每个元素转成String类型
let values = [1, 2, 3]
let str1 = values.map({
"水军\($0)"}
)
print(str1) // ["水军1", "水军2", "水军3"]
// 对数组排序可以不用map函数,直接使用sorted()方法:
// 4.1 Set
let names: Set = ["5", "6", "9", "8", "2"]
let descendings = names.sorted(by: >)
print(descendings) // ["9", "8", "6", "5", "2"]
// 4.2 Array
let nums: Array = ["1","2","6","5"]
var desc = nums.sorted()
print(desc) // ["1", "2", "5", "6"]
desc = nums.sorted(by: >)
print(desc) // ["6", "5", "2", "1"]
// 5.遍历时可以添加条件判断逻辑
let str2 = values.map{ result -> Int in
if result % 2 == 0 {
return result * 10
} else {
return result
}
}
print(str2) // [1, 20, 3]
2.flatMap函数
- flatMap 依然会遍历数组的元素,并对这些元素执行闭包中定义的操作
- 与Map不同的是,它对最终的结果进行了所谓的“降维”操作。 本来原始数组是一个二维的, 但经过 flatMap 之后,它变成一维的了
- flatMap返回后的数组中不存在nil,同时它会把Optional解包
- flatMap可以把两个不同的数组合并成一个数组
/** 比较map和flatMap */
// 1.降维
let values = [[1,2,3],[4,5,6],[7,8,9]]
// map
let result1 = values.map{$0}
print(result1) // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
// compactMap
let result2 = values.compactMap{$0}
print(result2) // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
// flatMap
let result3 = values.flatMap{$0}
print(result3) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
// 2.过滤nil,Optional解包
let array = ["1", "two", "3", "4", "five", "6"]
// map
let maps: [Int?] = array.map { str in
return Int(str)
}
print(maps) // [Optional(1), nil, Optional(3), Optional(4), nil, Optional(6)]
// compactMap
let compactMaps: [Int] = array.compactMap { str in
return Int(str)
}
print(compactMaps) // [1, 3, 4, 6]
// flatMap在4.1后被compactMaps替换了
let flatMaps: [Int] = array.flatMap { str in
return Int(str)
}
print(flatMaps) // [1, 3, 4, 6]
3. filter函数
- filter方法用于过滤元素,即筛选出数组元素中满足某种条件的元素
// 1.条件判断
var values = [6, 7, 8, 9]
values = values.filter{$0 > 7}
print(values) // [8, 9]
// 2.筛选多维数组中的数据:flatMap配合filter使用
let arrays = [[5,2,0],[2,1,1],[9,8,5]]
let result = arrays.flatMap {
$0.filter { $0 % 2 == 0 }
}
print(result) // [2, 0, 2, 8]
// 3.筛选数组中长度大于2的元素
let arrays2 = ["i", "love", "u", "money"]
let result2 = arrays2.filter {
$0.count > 2
}
print(result2) // ["love", "money"]
4. reduce函数
- reduce 可以对数组的元素进行计算
- reduce 方法把数组元素组合计算为一个值,并且会接受一个初始值,这个初始值的类型可以和数组元素类型不同
- 将数组转成字符串,每个元素用顿号(、)隔开
// 1.拼接元素
let arr = ["love","i","you"]
let resultStr: String = arr.reduce("to") { (result, element) -> String in
print(result)
return result + ", " + element
}
print(resultStr)
/**
to
to, love
to, love, i
to, love, i, you
*/
// 2.计算数组元素的字符个数
let count: Int = arr.reduce(0) { (result, element) -> Int in
result + element.count
}
print(count) // 8
// 3.计算字符串中相同字符
let letters = "avbracdgbbcc"
let letterCount = letters.reduce(into: [:]) { counts, letter in
counts[letter, default: 0] += 1
}
print(letterCount) // ["b": 3, "c": 3, "r": 1, "g": 1, "v": 1, "d": 1, "a": 2]
// 4.计算数组元素的和:map配合reduce使用
let arrays1 = [[5,2,7],[4,8],[9,1,3]]
let sums = arrays1.map{ $0.reduce(0, +) }
print(sums) // [14, 12, 13]