Swift中的map和flatMap

在iOS 9以后的版本中,Swift語(yǔ)言中有了兩個(gè)函數(shù),一個(gè)叫做map, 一個(gè)叫做flatMap,這兩個(gè)概念在我們的函數(shù)式編程中非常有用。到底這兩個(gè)函數(shù)是什么意義呢?

map

首先看這個(gè)map,map顧名思義,就是映射,例如我們有一個(gè)數(shù)組,我們想把數(shù)組里面的每一個(gè)數(shù)乘以二。

let arr = [1, 2, 3, 4, 5, 6]
let twoTimesArray = arr.map { $0 * 2 }
twoTimesArray   // [2, 4, 6, 8, 10, 12]

從我們方法的定義可以看到,我們可以看到

Paste_Image.png

所以我們這個(gè)數(shù)組是不能是optional的,如果把上面的數(shù)組換成

let arr: [Int?] = [1, 2, 3, 4, 5, 6, nil]

我們就會(huì)報(bào)錯(cuò)了。

flatMap

概念

flatMap的主要作用,是把我們的這個(gè)把我們的多個(gè)集合合為一個(gè)集合。

let nestedArray = [[1, 2, 3], [4, 5, 6]]
let flattenedArray = nestedArray.flatMap{ $0 }
flattenedArray // [1, 2, 3, 4, 5, 6]

那么我們想讓每個(gè)元素乘以2,試著做如下的代碼

let nestedArray = [[1, 2, 3], [4, 5, 6]]
let flattenedArray = nestedArray.flatMap{ $0 * 2}
flattenedArray

什么?!竟然報(bào)錯(cuò)了,報(bào)錯(cuò)信息是這樣的


Paste_Image.png

可以看到,錯(cuò)誤提示了我們,實(shí)際上我們的的flatmap操作的不是數(shù)組中的元素,他操作的是整個(gè)數(shù)組。實(shí)際上,我們可以根據(jù)我們flatMap的定義也可以看到。第一個(gè)是這樣:

Paste_Image.png

可以很清楚的看到,這個(gè)函數(shù)是用來(lái)連接我們的結(jié)果的,所以就是將我們兩個(gè)數(shù)組連接起來(lái)。那么不僅如此,還有一個(gè)函數(shù)定義是這樣的:

Paste_Image.png

這個(gè)函數(shù)是什么意思呢,他是用來(lái)把我們的nil的值去掉的,例如如下的例子

let optionalInts: [Int?] = [1, nil, 2, 3, nil, 4, nil, 5]
let ints = optionalInts.flatMap { $0}
ints // [1, 2, 3, 4, 5]

是把我們的數(shù)組中的nil去除掉,這是flatMap的另外一種用法。這個(gè)也會(huì)是我們開發(fā)中非常有用的一個(gè)功能。實(shí)際上,這兩個(gè)方法是相似的,為什么說(shuō)呢?

剖析

我們可以這么想,如果我們上面的例子,數(shù)組如果變成這種樣子,我們可以得到

let nestedArray = [[],[1, 2, 3]]
let flattenedArray = nestedArray.flatMap{ $0}
flattenedArray // [1, 2, 3]

那么,我們的Optional其實(shí)也是一個(gè)枚舉類型,這個(gè)可以從Swift的API就能看出,我們可以這樣定義一個(gè)Optional.

let a: Optional<Int> = .Some(5)
let b: Optional<Int> = .None

所以我們可以把我們的數(shù)組中的nil看成是這種形式

let arr2: [Optional<Int>] = [.None, .Some(5), .None, .Some(2)]

這樣就很容易理解,這兩個(gè)函數(shù)的機(jī)制實(shí)際是一致的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • map 和 flatMap 是 Swift 中兩個(gè)常用的函數(shù),它們體現(xiàn)了 Swift 中很多的特性。對(duì)于簡(jiǎn)單的使用...
    SwiftCafe閱讀 1,598評(píng)論 5 16
  • 一、數(shù)組中的 map 和 flatMap 數(shù)組中的 map 對(duì)數(shù)組元素進(jìn)行某種規(guī)則的轉(zhuǎn)換,例如: 二、 flatM...
    kmplayer閱讀 4,196評(píng)論 0 6
  • map .map操作,對(duì)數(shù)組中的元素添加相同類型值,返回相同類型 .map操作,對(duì)數(shù)組中的元素添加不同類型值,返回...
    Panco_Lee閱讀 406評(píng)論 0 1
  • 粗鄙的簡(jiǎn)介 以下轉(zhuǎn)自CSDN的一篇博博客http://blog.csdn.net/fish_yan_/articl...
    小白猿閱讀 544評(píng)論 0 2
  • 看空某股票,大虧1.5w刀,又補(bǔ)了8k刀的看空,最近又虧了2k 簡(jiǎn)直了,明明知道大家都在看漲,自己也對(duì)這個(gè)行業(yè)抱有...
    下雨不愁_80閱讀 205評(píng)論 0 0

友情鏈接更多精彩內(nèi)容