swift常用高阶函数基本用法

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]

你可能感兴趣的:(swift常用高阶函数基本用法)