Swift高階函數(shù)map, filter, reduce,flatMap入門

在swift中托慨,對諸如Array, Dictionary集合類型使用map, filter, reduce進(jìn)行操作是非常方便的事情扫皱,隨著對swift語言的了解加深埠胖,開發(fā)者將越來越習(xí)慣间聊、越來越喜歡這種抽象度較高的語法族购,但愿如此壳贪,[流汗]。如果你沒有函數(shù)式語言編程的相關(guān)經(jīng)驗寝杖,在處理集合類型時违施,你的第一直覺可能是使用for-loop循環(huán)。本篇文章瑟幕,是關(guān)于swift中map, filter, reduce的基本概念和使用的入門介紹磕蒲,也是希望能借此文章幫助讀者改變編程習(xí)慣和編程思維留潦,提升swift開發(fā)效率。

Map-遍歷任意集合類型

我們可以使用for循環(huán)來計算一個數(shù)組中每個元素的平方值辣往,如下代碼所示

let values = [2.0, 4.0, 5.0, 7.0]
var squares: [Double] = []
for value in values {
  squares.append(value*value)
}

下面看一看愤兵,使用map來實(shí)現(xiàn)同樣的功能

let values = [2.0,4.0,5.0,7.0]
let squarses = values.map{$0*$0}
print(squarses)
let c = values.map{m in m * 3}
print(c)
//[4.0, 16.0, 25.0, 49.0]
//[6.0, 12.0, 15.0, 21.0]

基本格式

let 常量名 = 要遍歷的數(shù)組.map{$0*$0}
print("打印出數(shù)組,驗證函數(shù)")
// $0表示當(dāng)前遍歷的集合對象中的一個元素排吴,就這樣,不要想得太復(fù)雜懦鼠;也請多想一點(diǎn)點(diǎn)钻哩,查找相關(guān)資料多做了解。

Filter - 過濾 篩選

Filter肛冶,顧名思義街氢,就是過濾、篩選的意思睦袖,對于一個集合對象而言珊肃,filter函數(shù)的作用是遍歷該集合,然后將該集合中符合某些特定條件的元素組成新的數(shù)組馅笙,并返回該新數(shù)組伦乔,也就是說選擇集合中符合條件的元素醇坝,過濾掉不符合條件的元素

let digits = [1, 4, 10, 15]
let even = digits.filter { $0 % 2 == 0 }
// [4, 10]

Reduce - 組合

Reduce凭疮,我所了解的英文翻譯是減少、降低铡俐,在此處這樣理解是不正確的皿淋,在swift函數(shù)式編程的概念中招刹,reduce有“組合、歸納”的意思窝趣,使用reduce函數(shù)可以將一個集合中的所有元素組合起來疯暑,生成一個新的值并返回該值
Reduce函數(shù)接收兩個參數(shù),一個初始值和一個組合閉包(combine closure)哑舒,例如妇拯,將一個數(shù)組中的各個元素與一個初始值10相加,可以使用reduce函數(shù)散址,如下代碼所示

let items = [2.0, 4.0, 5.0, 7.0]
let total = items.reduce(10, combine: +)
// 28.0

同樣乖阵,這也適用于使用+將數(shù)組中的string進(jìn)行拼接,如下代碼

let codes = ["abc", "def", "ghi"]
let text = codes.reduce("", combine: +)
// "abcdefghi"

FlatMap-連接

Flat是什么意思呢预麸?它表示平坦的瞪浸、扁平的,這是它的形容詞意思吏祸,它的動詞意思有“使...扁平”对蒲,在swift中flatMap表示將多個集合對象扁平化為一個數(shù)組钩蚊,也就說把多個集合連接成一個集合,下面的代碼展示了最簡單的flatMap使用

let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let flat = collections.flatMap { $0 }
// [5, 2, 7, 4, 8, 9, 1, 3]

甚至蹈矮,flatMap還“知道”可選值的概念砰逻,它將會把集合中的nil元素移除掉,如下代碼所示:

let people: [String?] = ["Tom", nil, "Peter", nil, "Harry"]
let valid = people.flatMap { $0 }
// ["Tom", "Peter", "Harry"]

再看看filter和flatMap組合使用的例子泛鸟,先將一個數(shù)組中的多個字?jǐn)?shù)組扁平化(flat)為一個數(shù)組蝠咆,然后再使用過濾(filter)篩選出數(shù)組中的偶數(shù),如下代碼所示

let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
// 此處even表示偶數(shù)
let onlyEven = collections.flatMap {
  intArray in intArray.filter { $0 % 2 == 0 }
  // result -- [2, 4, 8]
}

簡寫如下

let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let onlyEven = collections.flatMap { $0.filter { $0 % 2 == 0 }}
// result -- [2, 4, 8]

最后一個例子北滥,使用flatMap和reduce來計算一個數(shù)組中所有整型子數(shù)組的內(nèi)的所有元素相加計算的和(sum)刚操,還是使用閉包的簡寫語法和完整的規(guī)范寫法,如下代碼所示:

let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let sums = collections.flatMap { $0.reduce(0, combine:+) }
let sums2 = collections.flatMap { 
  intArray in intArray.reduce(0, combine:+)
}

Chaining 鏈?zhǔn)秸Z法

我們可以通過鏈?zhǔn)秸Z法來使用swift的map, filter, reduce以及flatMap再芋,例如計算集合中大于等于7的數(shù)字的和菊霜,可以先使用filter篩選,然后在使用reduce求和济赎,如下代碼所示:

let marks = [4, 5, 8, 2, 9, 7]
let totalPass = marks.filter { $0 >= 7}.reduce(0, combine: +)
// result - 24

再比如鉴逞,求一個數(shù)組中的元素的平方值是偶數(shù)的集合,可以先通過map計算所有平方值司训,然后在通過filter篩選出偶數(shù)构捡,如下代碼所示:

let numbers = [20, 17, 35, 4, 12]
let evenSquares = numbers.map { $0 * $0 }.filter { $0 % 2 == 0 }
// result -- 400, 16, 144

其實(shí)稍微思考也覺得這沒什么高深,因為map和filter返回的是一個數(shù)組壳猜,我們當(dāng)然可以對返回的數(shù)組繼續(xù)使用map, filter, reduce以及flatMap操作叭喜。

一些小小的總結(jié)

以后在使用swift編碼的過程中,當(dāng)你意識到自己在對一個集合對象進(jìn)行遍歷操作時蓖谢,你該思考一下是否可以使用map, filter或者reduce函數(shù)來替代捂蕴。

以下是總結(jié)了以下map, filter, reduce的特性:

  • map返回了一個結(jié)果集,該集合中包含的所有元素是來于對源數(shù)組中每一個元素進(jìn)行相同的轉(zhuǎn)換之后形成的新元素闪幽。
  • filter返回一個結(jié)果集啥辨,該集合包含的元素是源數(shù)組中的每一個符合篩選條件的元素。
  • reduce返回一個值盯腌,該值是對初始值和集合中的每個元素調(diào)用閉包中相同的操作生成的溉知。

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腕够,隨后出現(xiàn)的幾起案子级乍,更是在濱河造成了極大的恐慌,老刑警劉巖帚湘,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玫荣,死亡現(xiàn)場離奇詭異,居然都是意外死亡大诸,警方通過查閱死者的電腦和手機(jī)捅厂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門贯卦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焙贷,你說我怎么就攤上這事撵割。” “怎么了辙芍?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵啡彬,是天一觀的道長。 經(jīng)常有香客問我故硅,道長外遇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任契吉,我火速辦了婚禮,結(jié)果婚禮上诡渴,老公的妹妹穿的比我還像新娘捐晶。我一直安慰自己,他們只是感情好妄辩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布惑灵。 她就那樣靜靜地躺著,像睡著了一般眼耀。 火紅的嫁衣襯著肌膚如雪英支。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天哮伟,我揣著相機(jī)與錄音干花,去河邊找鬼。 笑死楞黄,一個胖子當(dāng)著我的面吹牛池凄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬼廓,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肿仑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碎税?” 一聲冷哼從身側(cè)響起尤慰,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雷蹂,沒想到半個月后伟端,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匪煌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年荔泳,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕉饼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡玛歌,死狀恐怖昧港,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情支子,我是刑警寧澤创肥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站值朋,受9級特大地震影響叹侄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昨登,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一趾代、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丰辣,春花似錦撒强、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琐凭,卻和暖如春芽隆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背统屈。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工胚吁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愁憔。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓囤采,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惩淳。 傳聞我的和親對象是個殘疾皇子蕉毯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 在swift中,對諸如Array, Dictionary集合類型使用map, filter, reduce進(jìn)...
    herbsun閱讀 1,425評論 0 6
  • 此篇為譯文思犁,首次翻譯外文會存在紕漏代虾,見諒... 原文:Swift Guide to Map Filter Redu...
    ChrisPzzz閱讀 5,580評論 4 11
  • Swift函數(shù)式編程之Map&Reduce&Filter 什么是函數(shù)式編程呢?函數(shù)式編程其實(shí)是一種編程思想, 代碼...
    TitanCoder閱讀 669評論 0 3
  • 初冬暖風(fēng),拂過臉頰激蹲,陣陣暖意棉磨, 銀杏紛飛,恰似金蝶学辱,翩翩起舞乘瓤, 滿地金黃环形,拾起一片,續(xù)寫篇章衙傀。
    Dan小丹閱讀 251評論 0 0
  • 股票 一直以來她都不相信股票可以賺到錢所以對于那些成天談股票炒股票的人抬吟,她都不屑一顧覺得那都是不理智沒有普的事情...
    秋日麥田閱讀 154評論 0 0