理解Swift中map 和 flatMap对集合的作用

map和flatMap是函数式编程中常见的概念,python等语言中都有。借助于 map和flapMap 函数能够很轻易地将数组转换成另外一个新数组。

map函数能够被数组调用,它接受一个闭包作为参数,作用于数组中的每个元素。闭包返回一个变换后的元素,接着将所有这些变换后的元素组成一个新的数组。

简单的说, map就是映射函数,把一个集合映射成另一个集合。


Swift的flatMap不容易理解,flatMap很像map函数,但是它摒弃了那些值为nil的元素。

flatMap是在处理一个容器而不是数组,这样可以更好地理解它。


为了处理可选类型,flatMap被重载过。它会接受一个可选类型的数组并返回一个拆包过的且没有nil值的可选类型组成的数组。

下面是flatMap的定义
extension SequenceType {

    /// Return an `Array` containing concatenated results of mapping `transform`
    /// over `self`.
    func flatMap<S : SequenceType>(@noescape transform: (Self.Generator.Element) -> S) -> [S.Generator.Element]
}

extension SequenceType {

    /// Return an `Array` containing the non-nil results of mapping `transform`
    /// over `self`.
    func flatMap<T>(@noescape transform: (Self.Generator.Element) -> T?) -> [T]
}




参考下面的示例代码:

let test1 = (1...7).map{ (i : Int) -> String?  in
    return  i > 1 ? String("sss \(i)") : nil
}
print(test1)

let test2 = (1...7).flatMap{ (i : Int) -> String?  in
    return  i > 1 ? String("sss \(i)") : nil
}
print(test2)


执行结果

[nil, Optional("sss 2"), Optional("sss 3"), Optional("sss 4"), Optional("sss 5"), Optional("sss 6"), Optional("sss 7")]
["sss 2", "sss 3", "sss 4", "sss 5", "sss 6", "sss 7"]


参考文章


http://swift.gg/2015/08/06/swift-2-flatmap/

https://segmentfault.com/a/1190000004050907

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

offbye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值