swift常用高階函數(shù)基本用法

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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兔港,隨后出現(xiàn)的幾起案子庸毫,更是在濱河造成了極大的恐慌,老刑警劉巖衫樊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飒赃,死亡現(xiàn)場離奇詭異,居然都是意外死亡科侈,警方通過查閱死者的電腦和手機载佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀栈,“玉大人蔫慧,你說我怎么就攤上這事∪ㄊ恚” “怎么了姑躲?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盟蚣。 經(jīng)常有香客問我黍析,道長,這世上最難降的妖魔是什么屎开? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任阐枣,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔼两。我一直安慰自己甩鳄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布宪哩。 她就那樣靜靜地躺著娩贷,像睡著了一般第晰。 火紅的嫁衣襯著肌膚如雪锁孟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天茁瘦,我揣著相機與錄音品抽,去河邊找鬼。 笑死甜熔,一個胖子當(dāng)著我的面吹牛圆恤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腔稀,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼盆昙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焊虏?” 一聲冷哼從身側(cè)響起淡喜,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诵闭,沒想到半個月后炼团,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡疏尿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年瘟芝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥琐。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锌俱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敌呈,到底是詐尸還是另有隱情贸宏,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布驱富,位于F島的核電站锚赤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褐鸥。R本人自食惡果不足惜线脚,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浑侥,春花似錦姊舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伶选,卻和暖如春史飞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仰税。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工构资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨簇。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓吐绵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親河绽。 傳聞我的和親對象是個殘疾皇子己单,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353