美文网首页
一张图解说Map/filter/reduce

一张图解说Map/filter/reduce

作者: codeTao | 来源:发表于2021-05-27 11:36 被阅读0次

    Twitter用户‏@steveluscher用一张图简明精要形象解释了函数式编程中Map/filter/reduce的意义:

    简单文字说明一下:

    • map对玉米、牛和鸡这个集合进行烹饪操作,结果分别是(玉米加工成)爆玉米花、(牛加工成)牛肉汉堡、(鸡加工成)煎鸡蛋。

    • filter是对爆米花、牛肉汉堡和煎鸡蛋进行哪个是素食的操作,结果是爆米花和煎鸡蛋。

    • reduce是对爆米花和煎鸡蛋进行吃的操作,结果是一坨屎。


    Swift - 高阶函数介绍(map、flatMap、filter、reduce)

    Swift 提供了如下几个高阶函数:map、flatMap、filter、reduce。使用高阶函数进行函数式编程不仅可以简化我们的代码,而且当数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)。

    一、map 函数
    1,方法介绍
    map 方法获取一个闭包表达式作为其唯一参数。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值。
    简单说就是数组中每个元素通过某个方法进行转换,最后返回一个新的数组。

    2,使用样例
    (1)下面将 Int 类型数组(各个商品的金额),转换成 String 类型的数组(在金额前加上 $ 符号)

    let prices = [20,30,40]
    let strs = prices.map({ "$\($0)" })
    print(strs)  // ["$20", "$30", "$40"]
    

    (2)对一个数组里面的数据进行平方操作

    let values = [4, 6, 9]
    let squares = values.map({ $0 * $0 })
    print(squares)  //[16, 36, 81]
    

    二、flatMap 函数
    1,方法介绍
    flatMap 方法同 map 方法比较类似,只不过它返回后的数组中不存在 nil(自动把 nil 给剔除掉),同时它会把 Optional 解包。

    2,使用样例
    (1)下面比较 map 和 flatMap 这两个方法

    let array = ["Apple", "Orange", "Grape", ""]
     
    let arr1 = array.map { a -> Int? in
        let length = a.count
        guard length > 0 else { return nil }
        return length
    }
    print("arr1:\(arr1)")
     
    let arr2 = array.flatMap { a-> Int? in
        let length = a.count
        guard length > 0 else { return nil }
        return length
    }
    print("arr2:\(arr2)")
    /*
    arr1:[Optional(5), Optional(6), Optional(5), nil]
    arr2:[5, 6, 5]
    */
    

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

    let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    let arr1 = array.map{ $0 }   // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    let arr2 = array.flatMap{ $0 } // [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    三、filter 函数
    1,方法介绍
    filter 方法用于过滤元素,即筛选出数组元素中满足某种条件的元素。

    2,使用样例
    (1)筛选出金额大于 25 的元素。

    let prices = [20,30,40]
    let result = prices.filter({ $0 > 25 })
    print(result)  //[30, 40]
    

    四、reduce 函数
    1,方法介绍
    reduce 方法把数组元素组合计算为一个值,并且会接受一个初始值,这个初始值的类型可以和数组元素类型不同。

    2,使用样例
    (1)将数组中的金额相加,计算总和。

    let prices = [20,30,40]
    let sum = prices.reduce(0) { $0 + $1 }
    print(sum)  //90
    

    注意:上面计算总数代码还可以简化成如下代码:

    let sum = prices.reduce(0, +)
    

    (2)将数组转成字符串,每个元素用顿号(、)隔开。

    let array = ["Apple", "Orange", "Grape"]
    let str = array.reduce("", {
        return $0 == "" ? $1 : $0 + "、" + $1
    })
    print(str)  //Apple、Orange、Grape
     
    //上面等效与
    let str = array.joined(separator: "、")
    

    五、高阶函数的组合使用、链式调用
    1,组合使用
    (1)flatMap 配合 filter 将多维整型数组里面的偶数筛选出来并且组合成了一个一维数组。

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

    (2)map 配合 reduce 计算二维数组里每个分组的总和。

    let collections = [[5,2,7],[4,8],[9,1,3]]
    let sums = collections.map({ $0.reduce(0, +) })
    print(sums) // [14, 12, 13]
    

    2,链式组合
    (1)将数组中大于 7 的所有数字进行求和操作。

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

    (2)对某一个数组里面的数字进行平方操作然后再筛选出偶数值。

    let numbers = [4,5,8,2,9,7]
    let evenSquares = numbers.map{$0 * $0}.filter{$0 % 2 == 0} //[16, 64, 4]
    

    转自:https://www.hangge.com/blog/cache/detail_1827.html#

    相关文章

      网友评论

          本文标题:一张图解说Map/filter/reduce

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