zoukankan      html  css  js  c++  java
  • 理解Swift中map 和 flatMap对集合的作用

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

    map函数可以被数组调用,它接受一个闭包作为參数,作用于数组中的每一个元素。闭包返回一个变换后的元素。接着将全部这些变换后的元素组成一个新的数组。

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


    Swift的flatMap不easy理解,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

  • 相关阅读:
    最近实际项目中遇到的技术问题与解决思路
    独立完成一个城市选择组件(阿里前端题目,内附知识点、思路)
    用Node.js写爬虫,撸羞羞的图片
    Flutter项目之app升级方案
    Flutter数据持久化入门以及与Web开发的对比
    为什么要学会正则表达式
    async/await,了解一下?
    面向面试题和实际使用谈promise
    从一次输入框无法输入的bug,谈如何限制输入框输入类型
    Vue组件的is具体用法
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7067159.html
Copyright © 2011-2022 走看看