swift中比較常用的高階函數(shù)有:map、flatMap罕邀、filter畅形、reduce。
使用高階函數(shù)可以簡化代碼量诉探,相對來說高階函數(shù)實現(xiàn)的效率會快一些日熬,它可以并行執(zhí)行。
1.map函數(shù)
- map可以對數(shù)組中的每一個元素做一次處理肾胯,如同遍歷的作用
- map 方法接受一個閉包作為參數(shù)竖席, 然后它會遍歷整個數(shù)組耘纱,并對數(shù)組中每一個元素執(zhí)行閉包中定義的操作。 相當(dāng)于對數(shù)組中的所有元素做了一個映射
- 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.數(shù)組每個元素轉(zhuǎn)成String類型
let values = [1, 2, 3]
let str1 = values.map({
"水軍\($0)"}
)
print(str1) // ["水軍1", "水軍2", "水軍3"]
// 對數(shù)組排序可以不用map函數(shù)束析,直接使用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函數(shù)
- flatMap 依然會遍歷數(shù)組的元素,并對這些元素執(zhí)行閉包中定義的操作
- 與Map不同的是憎亚,它對最終的結(jié)果進行了所謂的“降維”操作员寇。 本來原始數(shù)組是一個二維的, 但經(jīng)過 flatMap 之后第美,它變成一維的了
- flatMap返回后的數(shù)組中不存在nil蝶锋,同時它會把Optional解包
- flatMap可以把兩個不同的數(shù)組合并成一個數(shù)組
/** 比較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函數(shù)
- filter方法用于過濾元素什往,即篩選出數(shù)組元素中滿足某種條件的元素
// 1.條件判斷
var values = [6, 7, 8, 9]
values = values.filter{$0 > 7}
print(values) // [8, 9]
// 2.篩選多維數(shù)組中的數(shù)據(jù):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.篩選數(shù)組中長度大于2的元素
let arrays2 = ["i", "love", "u", "money"]
let result2 = arrays2.filter {
$0.count > 2
}
print(result2) // ["love", "money"]
4. reduce函數(shù)
- reduce 可以對數(shù)組的元素進行計算
- reduce 方法把數(shù)組元素組合計算為一個值扳缕,并且會接受一個初始值,這個初始值的類型可以和數(shù)組元素類型不同
- 將數(shù)組轉(zhuǎn)成字符串恶守,每個元素用頓號(第献、)隔開
// 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.計算數(shù)組元素的字符個數(shù)
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.計算數(shù)組元素的和:map配合reduce使用
let arrays1 = [[5,2,7],[4,8],[9,1,3]]
let sums = arrays1.map{ $0.reduce(0, +) }
print(sums) // [14, 12, 13]