Swift-05.Array的常見操作

  • map / filter / reduce
var arr = [1, 2, 3, 4]
// [2, 4, 6, 8]
var arr2 = arr.map { $0 * 2 }
// [2, 4]
var arr3 = arr.filter { $0 % 2 == 0 } // 10
var arr4 = arr.reduce(0) { $0 + $1 } // 10
// 可簡(jiǎn)寫為
var arr5 = arr.reduce(0, +)
  • map接收函數(shù)作為參數(shù)
func double(_ i: Int) -> Int { i * 2 } 
var arr = [1, 2, 3, 4]
// [2, 4, 6, 8] 
print(arr.map(double))
  • compactMap默認(rèn)解包并去除nil
var arr = ["123", "test", "jack", "-30"] 

// [Optional(123), nil, nil, Optional(-30)] 
var arr2 = arr.map { Int($0) }

// [123, -30]
var arr3 = arr.compactMap { Int($0) }
  • 使用reduce實(shí)現(xiàn)map钳幅、filter函數(shù)的功能
var arr = [1, 2, 3, 4]

// [2, 4, 6, 8]
print(arr.map { $0 * 2 }) 
// 等價(jià)于??函數(shù)功能
print(arr.reduce([]) { $0 + [$1 * 2] })

// [2, 4]
print(arr.filter { $0 % 2 == 0 }) 
// 等價(jià)于??函數(shù)功能
print(arr.reduce([]) { $1 % 2 == 0 ? $0 + [$1] : $0 })
  • map,flatMap功能對(duì)比
var arr = [1, 2, 3]
// [[1], [2, 2], [3, 3, 3]] 拿到什么(數(shù)組)赵誓,返回?cái)?shù)組(二維數(shù)組)就放什么得哆,不做處理芹务。
var arr2 = arr.map { Array.init(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3] 將拿到的數(shù)組中的元素取出放到返回?cái)?shù)組(一維數(shù)組)中。扁平化處理狸吞。
var arr3 = arr.flatMap { Array.init(repeating: $0, count: $0) }
  • lazy的優(yōu)化map
let arr = [1, 2, 3]
let result = arr.lazy.map {
    (i: Int) -> Int in 
    print("mapping \(i)") 
    return i * 2
}
print("begin-----")
print("mapped", result[0]) 
print("mapped", result[1]) 
print("mapped", result[2]) 
print("end----")
// 第一次用到時(shí)胆描,才會(huì)執(zhí)行相應(yīng)邏輯
begin----- 
mapping 1 
mapped 2 
mapping 2 
mapped 4 
mapping 3 
mapped 6 
end----
  • mapflatMap可選值Optional處理中的應(yīng)用
var num1: Int? = 10
// Optional(20)
var num2 = num1.map { $0 * 2 }

var num3: Int? = nil
// nil,發(fā)現(xiàn)$0為nil直接返回nil
var num4 = num3.map { $0 * 2 }

mapflatMap對(duì)比

var num1: Int? = 10
// Optional(Optional(20)), map還是會(huì)對(duì)可選值再包裝一層
var num2 = num1.map { Optional.some($0 * 2) }

// Optional(20), flatMap發(fā)現(xiàn)已經(jīng)是可選值醋粟,就不會(huì)再包裝了
var num3 = num1.flatMap { Optional.some($0 * 2) }

可用于簡(jiǎn)化代碼

// 示例一:
var num1: Int? = 10
var num2 = (num1 != nil) ? (num1! + 10) : nil 
var num3 = num1.map { $0 + 10 }
// num2靡菇、num3是等價(jià)的

// 示例二:
var fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
var str: String? = "2011-09-10"
// old
var date1 = str != nil ? fmt.date(from: str!) : nil 
// new
var date2 = str.flatMap(fmt.date)

// 示例三:
var score: Int? = 98
// old
var str1 = score != nil ? "socre is \(score!)" : "No score" 
// new
var str2 = score.map { "score is \($0)" } ?? "No score"

// 示例四:
struct Person {
    var name: String
    var age: Int
}
var items = [
    Person(name: "jack", age: 20), 
    Person(name: "rose", age: 21), 
    Person(name: "kate", age: 22)
]
// old
func getPerson1(_ name: String) -> Person? {
    let index = items.firstIndex { $0.name == name } 
    return index != nil ? items[index!] : nil
}
// new
func getPerson2(_ name: String) -> Person? {
    return items.firstIndex { $0.name == name }.map { items[$0] }
}

// 示例五:
struct Person {
    var name: String
    var age: Int
    init?(_ json: [String : Any]) {
        guard let name = json["name"] as? String, 
        let age = json["age"] as? Int else {
            return nil
        }
        self.name = name 
        self.age = age
    } 
}
var json: Dictionary? = ["name" : "Jack", "age" : 10] 
// old
var p1 = json != nil ? Person(json!) : nil
// new
var p2 = json.flatMap(Person.init)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末重归,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厦凤,更是在濱河造成了極大的恐慌鼻吮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较鼓,死亡現(xiàn)場(chǎng)離奇詭異椎木,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)博烂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門香椎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禽篱,你說我怎么就攤上這事畜伐。” “怎么了躺率?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵烤礁,是天一觀的道長。 經(jīng)常有香客問我肥照,道長脚仔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任舆绎,我火速辦了婚禮鲤脏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕朵。我一直安慰自己猎醇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布努溃。 她就那樣靜靜地躺著硫嘶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧税。 梳的紋絲不亂的頭發(fā)上沦疾,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音第队,去河邊找鬼哮塞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凳谦,可吹牛的內(nèi)容都是我干的忆畅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸执,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼家凯!你這毒婦竟也來了缓醋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤绊诲,失蹤者是張志新(化名)和其女友劉穎送粱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驯镊,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葫督,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年竭鞍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了板惑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偎快,死狀恐怖冯乘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晒夹,我是刑警寧澤裆馒,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丐怯,受9級(jí)特大地震影響喷好,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜读跷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一梗搅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧效览,春花似錦无切、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘦锹,卻和暖如春籍嘹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弯院。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工噩峦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抽兆。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓识补,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辫红。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凭涂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 一. Array常用的內(nèi)置函數(shù) 1. map 遍歷數(shù)組中的元素切油,傳入到后面的閉包里面蝙斜,閉包的返回值組成新的數(shù)組,最...
    Imkata閱讀 1,478評(píng)論 0 2
  • 一澎胡、函數(shù)式編程學(xué)習(xí)前的基礎(chǔ)知識(shí) 1.1孕荠、Array 的常見操作map:映射的意思,它把數(shù)據(jù)進(jìn)行循環(huán)攻谁,每次循環(huán)都會(huì)走...
    IIronMan閱讀 403評(píng)論 0 3
  • Swift語言是支持函數(shù)式編程的,所以我們需要簡(jiǎn)單了解一下函數(shù)式編程的概念. 在了解函數(shù)式編程的概念之前呢,先看看...
    小心韓國人閱讀 712評(píng)論 0 0
  • Array的常見操作 arr.map() : 遍歷數(shù)組每一個(gè)元素, 每遍歷一個(gè)元素調(diào)用一次閉包,將元素傳入閉包,閉...
    codeTao閱讀 251評(píng)論 1 1
  • 高階函數(shù)的定義: 在 Wikipedia 中稚伍,是這么定義高階函數(shù)(higher-order function)的,...
    半心_忬閱讀 5,128評(píng)論 1 16