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]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356