swift中map和flatMap的区别-flatMap可以降维打击附Demo代码下载

54 篇文章 1 订阅
47 篇文章 1 订阅

在1维数组中Map和flatMap的基本用法

Map用法

基本功能:在1维数组中他俩的功能都是遍历数组,并且执行闭包{} 内的表达式,然后返回结果赋值给数组中的元素.
首先Map和flatMap都是映射,用微积分里面的东西就是 y = f(x) ,这里面的x是数组中的元素,f就是 Map和flatMap后面闭包的表达式,就是把变量进行运算的.y就是执行的结果.
y = f(x) = x+ 2
用代码来写就是
变量.map{}

let arr1 = [1,2,3,4]
let result = arr1.map { $0 + 2 }
print("result =",result)

执行结果打印:result = [3, 4, 5, 6]

高阶函数

y = f(f(x)),这个是高阶函数,也就是说把 x+2 的结果 y 再执行x+2
格式如下
变量.map{}
.map{}
代码如下:
相面代码,每次函数计算都是 x + 2

let arr1 = [1,2,3,4]
 //高阶函数,连续执行map{}
let result2 = arr1.map { $0 + 2 }
				  .map{$0 + 2}
print("result2 =",result2)

运行结果打印:result2 = [5, 6, 7, 8]

也可以连续执行3次,高阶函数的意思就是把上次运行结果,当做下一个函数的入参继续运算

     //连续执行map 3次
        let result3 = arr1.map { $0 + 2 }
            .map{$0 + 1}
            .map{$0 * 2}
        print("result3 =",result3)

运行结果:
result3 = [8, 10, 12, 14]

flatMap在1维数组中跟map运行结果一样

let arr1 = [1,2,3,4]
let result = arr1.flatMap { $0 + 2 }
print("result =",result)

运行结果打印:
result = [3, 4, 5, 6]

Map二维数组,数组维度不会改变

下面map里面第一层{$0是获取到第一个数组内的元素,是个1维数组:[1,2,3,4],然后对这个1维数组进行.map{$0 + 3},意思就是遍历1维数组这里面的每个元素,返回 + 3的值. 第一个元素就变成了 [4,5,6,7],然后遍历出第二个元素结果是[10, 11, 12]}

		let arr2 = [[1,2,3,4],[7,8,9]]
        let result = arr2.map { $0.map{$0 + 3}}
        print("result =",result)

运行结果:result = [[4, 5, 6, 7], [10, 11, 12]]

2维数组,flatMap开始降维打击

result

		let arr2 = [[1,2,3,4],[7,8,9]]
		//第一层flatMap降维,到了闭包里面变成1维数组,用map和flatMap一样
		//因为在flatMap { $0里面已经变成了1维数组,所以在闭包里面直接用map和flatMap没区别}
  		let result = arr2.flatMap { $0.map{$0 + 3}}
        print("降维变成1维数组result =",result)
        //因为在flatMap { $0里面已经变成了1维数组,所以在闭包里面直接用map和flatMap没区别}
        let result2 = arr2.flatMap { $0.flatMap{$0 + 3}}
        print("降维变成1维数组result2 =",result2)

打印结果:
降维变成1维数组result = [4, 5, 6, 7, 10, 11, 12]
降维变成1维数组result2 = [4, 5, 6, 7, 10, 11, 12]

3维数组 flatMap可以连续降维

		let arr3 = [[[1,2,3,4],[7,8,9]],[[11,12,13],[15,16,17]]]
  		//flatMap连续2次降维,从3维变成1维
        //flatMap跟Map一样,只是当出现1维以上的时候,降低一个维度
        let result = arr3.flatMap { $0.flatMap{$0.map{$0 + 3}}} //从3维降到1维
        
        print("降维变成1维数组result =",result)
        //flatMap降维1次,map不降维,从3维变成2维
        let result2 = arr3.flatMap { $0.map{$0.map{$0 + 3}}}//从3维降到2维(二向箔)
        print("降维变成2维数组result2 =",result2)

Demo下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Swift ,`map` 和 `flatMap` 是两个常用的高阶函数,用于处理数组(Array)或可选值(Optional)。 1. `map` 函数:`map` 函数可以将一个数组的每个元素都应用一个转换函数,并返回一个新的数组,新数组的元素是原数组经过转换后的结果。例如: ```swift let numbers = [1, 2, 3, 4, 5] let doubledNumbers = numbers.map { $0 * 2 } print(doubledNumbers) // 输出 [2, 4, 6, 8, 10] ``` 在上面的例子,`map` 函数将数组 `numbers` 的每个元素都乘以 2,返回了一个新的数组 `doubledNumbers`。 2. `flatMap` 函数:`flatMap` 函数可以将一个数组的每个元素都应用一个转换函数,然后将转换结果连接起来,并返回一个新的数组。与 `map` 不同的是,`flatMap` 还会自动过滤掉转换结果的 `nil` 值(如果有的话)。例如: ```swift let names = ["Alice", "Bob", "Charlie"] let flattenedNames = names.flatMap { $0.uppercased() } print(flattenedNames) // 输出 ["A", "L", "I", "C", "E", "B", "O", "B", "C", "H", "A", "R", "L", "I", "E"] ``` 在上面的例子,`flatMap` 函数将数组 `names` 的每个元素都转换成大写字母,并将结果连接起来,得到了一个新的数组 `flattenedNames`。 需要注意的是,对于可选值(Optional),`flatMap` 函数还有另外一种用法。它可以将一个可选值进行解包,并返回其的非空值,如果可选值为 `nil`,则返回一个空的数组。例如: ```swift let optionalNumber: Int? = 5 let flattenedNumber = optionalNumber.flatMap { [$0 * 2] } print(flattenedNumber) // 输出 [10] let nilOptionalNumber: Int? = nil let flattenedNilNumber = nilOptionalNumber.flatMap { [$0 * 2] } print(flattenedNilNumber) // 输出 [] ``` 在上面的例子,`flatMap` 函数将可选值 `optionalNumber` 解包,并将解包后的非空值乘以 2,并返回一个包含该结果的数组。而对于 `nilOptionalNumber`,由于可选值为 `nil`,所以返回了一个空的数组。 希望这些示例能够帮助你理解 Swift `map` 和 `flatMap` 的用法。如果你还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值