函數(shù)式編程之Map&Reduce

一.內(nèi)容概述

  • 在上一篇中介紹了什么是函數(shù)式編程, 以及介紹了最常用的一個函數(shù)式編程函數(shù)Filter
  • 詳情請查看 Swift中的函數(shù)式編程
  • 這篇文章中介紹函數(shù)式編程中另外兩個非常常用和重要的函數(shù): Map&Reduce
  • 理解了這兩個東西基本對函數(shù)式編程就會有一定的理解和認識.

二. Map的使用

1. Map的介紹

  • Map在此處并非地圖的意思, 它的含義是映射
  • 將一個元素映射成另外一種元素(類似于字典中的Key/Value映射)
  • 其實Swift系統(tǒng)本身是有映射的函數(shù), 可以將一個集合映射成另外一個集合

2. 示例分析

  • 比如:
    • 將一個String類型的數(shù)組, 映射成一個Int類型的數(shù)組
    • 將一個String類型的數(shù)組, 映射成一個Emoji數(shù)組
  • 如何使用呢?
// 1.定義字符串?dāng)?shù)組
let animals = ["DRAGON", "CAT", "TIGER"]

// 2.使用函數(shù)映射
let animalEmojis = animals.map { (str : String) -> Character in
    let tmp = "\\N{\(str)}"
    let emojiStr =
    tmp.stringByApplyingTransform(
        NSStringTransformToUnicodeName,
        reverse: true)

    return emojiStr!.characters.first!
}

// 3.打印結(jié)果
print(animalEmojis)
  • 結(jié)果如下:
  • 分析map后面的大括號{}
    • 其實{}本身也可以是一個函數(shù)
    • 例如我單獨將函數(shù)抽取出來,并且傳入.
    • 代碼如下:
// 0.定義字符串?dāng)?shù)組
let animals = ["DRAGON", "CAT", "TIGER"]

// 1.抽取函數(shù)
func strToEmoji(str : String) -> Character {
    let tmp = "\\N{\(str)}"
    let emojiStr =
    tmp.stringByApplyingTransform(
        NSStringTransformToUnicodeName,
        reverse: true)

    return emojiStr!.characters.first!
}

// 2.將函數(shù)傳入
let animalEmojis = animals.map(strToEmoji)

// 3.打印結(jié)果
print(animalEmojis)
  • 代碼分析:
    • 通過上述代碼我們知道, 其實map函數(shù)是接收一個函數(shù)作為參數(shù).
    • 而函數(shù)本身是告訴map函數(shù), 在映射過程中究竟是進行怎樣的轉(zhuǎn)化

3.定義自己的Map函數(shù)

  • 我們可以給Array擴展一個函數(shù), 函數(shù)接收一個閉包參數(shù)
// 1.定義自己的map函數(shù)
extension Array {
    func myMap<SrcType, DestType>(transform: (SrcType) -> (DestType)) -> [DestType] {
            var output: [DestType] = []

            for item in self {
                let transformed =
                transform(item as! SrcType)
                output.append(transformed)
            }

            return output
    }
}

// 2.使用自己的map函數(shù)
let animals = ["DRAGON", "CAT", "TIGER"]

let animalEmojis = animals.myMap { (str : String) -> (Character) in
    let tmp = "\\N{\(str)}"
    let emojiStr =
    tmp.stringByApplyingTransform(
        NSStringTransformToUnicodeName,
        reverse: true)

    return emojiStr!.characters.first!
}

print(animalEmojis)
  • 代碼分析
    • Map有兩個泛型類型, 一個是原始類型, 一個是目標類型
    • 在自己的Map函數(shù)中, 使用外界傳入的函數(shù), 進行轉(zhuǎn)化, 并且生成新的類型
    • 放入數(shù)組中, 進行返回即可

二. Reduce的使用

1.Reduce的介紹

  • Reduce也是函數(shù)式編程中很常見的一個函數(shù)
  • 它的作用是用于將集合中的內(nèi)容合并起來, 獲取到合并后的結(jié)果
  • 合并的規(guī)則可以由調(diào)用者來指定, 可以是:相加/相乘/字符串拼接.
  • 總之, 你告訴函數(shù)如何合并, 函數(shù)會給你一個合并后的結(jié)果

2.Reduce的使用

  • 我們來看一個Reduce的示例
// 1.定義數(shù)組
let numbers = [1, 2, 3, 4, 5]

// 2.合并數(shù)組中所有的元素
// 2.1.普通做法
var total = 0
for num in numbers {
    total += num
}

// 2.2.函數(shù)式編程中Reduce
var total1 = numbers.reduce(0) { (num1 : Int, num2 : Int) -> Int in
    return num1 + num2
}
var total2 = numbers.reduce(0) { $0 + $1 }
  • 代碼解析
    • 有一個Int類型數(shù)組, 想要將數(shù)組中元素合并
    • 普通做法是直接遍歷, 但是如果我們不是相加, 有其他合并需求, 則需要更改for循環(huán)中的需求
    • 但是通過我們系統(tǒng)提供的reduce, 讓我們直接傳入閉包. 并且告知函數(shù)規(guī)則, 就可以進行合并
    • reduce函數(shù)接收兩個參數(shù):
      • 參數(shù)一: 第一次合并之前的初始化值
      • 參數(shù)二: 閉包參數(shù), 閉包中的參數(shù)一是每次合并后的值, 第二個參數(shù)是后面要合并的元素
    • { $0 + $1 } --> 閉包的一種簡便寫法

3. 定義自己的Reduce函數(shù)

  • 我們還是給系統(tǒng)的Array擴充一個自己的Reduce方法
// 1.定義自己的Reduce函數(shù)
extension Array {
    func myReduce<C, T>(initial: C, combine: (C, T) -> C) -> C {
            var seed = initial

            for item in self {
                seed = combine(seed, item as! T)
            }

            return seed
    }
}


// 2.定義數(shù)組
let numbers = [1, 2, 3, 4, 5]

// 3.使用自己的Reduce函數(shù)
let result = numbers.myReduce(1) { (num1 : Int, num2 : Int) -> Int in
    return num1 * num2
}

// 4.打印結(jié)果
print(result)
  • 代碼解析
    • 我們給系統(tǒng)的Array擴充了一個myReduce函數(shù)
    • 函數(shù)需要兩個參數(shù):
      • 參數(shù)一: 合并之前的初始化值, 因為我要進行相乘, 所有應(yīng)該初始化值為1. 否則后面的結(jié)果都是0
      • 參數(shù)二: 閉包, 也就是合并規(guī)則
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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