一张图解说Map/filter/reduce

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#

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容