Swift_高级函数map & flatMap &

作者: Mccc_ | 来源:发表于2017-10-18 20:33 被阅读1433次

    一. map

    1. 可以对数组中的每一个元素做一次处理.
    let arr = [1,2,3]
    let doubleD = arr.map {   
        $0 * 2
    }
    $0 的意思是对数组的每一个元素都操作一次.
    doubleD的结果为 : [2, 4, 6]
    
    let mapArr = [1,2,3]
    let mapEndArr = mapArr.map {
        "No" + String($0)
    }
    mapEndArr的结果为 ["No1", "No2", "No3"]
    
    1. 返回值中允许nil的存在
    let opArr = ["1","2",nil,"3"]
    let opMapArr = opArr.map {
        $0
    }
    opMapArr结果为: [Optional("1"), Optional("2"), nil, Optional("3")]
    

    二. flatMap

    1. flatMap返回后的数组中不存在nil,同时它会把Optional解包.
    let opArr = ["1","2",nil,"3"]
    let opEndArr = opArr.flatMap {
        $0
    }
    opEndArr的结果为: ["1", "2", "3"]
    

    2.flatMap还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组

    let flatMapArr = [[1,2,3], [6,5,4]]
    let flatMapEndArr = flatMapArr.flatMap {
        $0
    }
    flatMapEndArr的结果为 [1, 2, 3, 6, 5, 4]
    
    1. flatMap也能把两个不同的数组合并成一个数组,这个合并的数组元素个数是前面两个数组元素个数的乘积
    let fruits = ["Apple", "Orange", "Puple"]
    let counts = [2, 3, 5]
    
    let array = counts.flatMap { count in
        fruits.map ({ fruit in
            return fruit + "  \(count)"
        })
    }
    array的结果 ["Apple 2", "Orange 2", "Puple 2", "Apple 3", "Orange 3", "Puple 3", "Apple 5", "Orange 5", "Puple 5"]
    

    三. filer:过滤,可以对数组中的元素按照某种规则进行一次过滤

    筛选出字符串的长度小于10的字符串
    let stringArray = ["Objective-C", "Swift", "HTML", "CSS", "JavaScript"]
    
    let resultArr_one = stringArray.filter { (string) -> Bool in
        return string.characters.count < 10
    }
    
    let resultArr_two = stringArray.filter {
        return $0.characters.count < 10
    }
    resultArr_one和resultArr_two的结果 ["Swift", "HTML", "CSS"]
    

    四. reduce

    Reduce 是 map、flatMap 或 filter 的一种扩展的形式(后三个函数能干嘛,reduce 就能用另外一种方式实现)。Reduce 的基础思想是将一个序列转换为一个不同类型的数据,期间通过一个累加器(Accumulator)来持续记录递增状态。为了实现这个方法,我们会向 reduce 方法中传入一个用于处理序列中每个元素的结合(Combinator)闭包 / 函数 / 方法。

    func combinator(accumulator: Int, current: Int) -> Int {
       return accumulator + current
    }
    [1, 2, 3].reduce(0, combine: combinator)
    // 执行步骤如下 
    combinator(0, 1) { return 0 + 1 } = 1
    combinator(1, 2) { return 1 + 2 } = 3
    combinator(3, 3) { return 3 + 3 } = 6
    结果为 6
    
    [1,2,3] 中的每个元素都将调用一次结合(Combinator)函数进行处理。同时我们使用累加器(Accumulator)变量实时记录递增状态(递增并非是指加法),这里是一个整型值。
    
    let stringArray = ["Objective-C", "Swift", "HTML", "CSS", "JavaScript"]
    let reduceStr = stringArray.reduce("", {
        print("史蒂夫 \($0) + \($1)")
        
        return $0 == "" ? $1 : $0 + "、" + $1
    })
    

    相关文章

      网友评论

      本文标题:Swift_高级函数map & flatMap &

      本文链接:https://www.haomeiwen.com/subject/wyieuxtx.html