理解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

时间: 2024-10-12 03:31:51

理解Swift中map 和 flatMap对集合的作用的相关文章

Spark 中 map 与 flatMap 的区别

通过一个实验来看Spark 中 map 与 flatMap 的区别. 步骤一:将测试数据放到hdfs上面 hadoopdfs -put data1/test1.txt /tmp/test1.txt 该测试数据有两行文本: 步骤二:在Spark中创建一个RDD来读取hdfs文件/tmp/test1.txt 步骤三:查看map函数的返回值 得到map函数返回的RDD: 查看map函数的返回值--文件中的每一行数据返回了一个数组对象 步骤四:查看flatMap函数的返回值 得到flatMap函数返回的

【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合

#[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)---深入理解Class中访问标志.类索引.父类索引.接口索引 3.[JVM虚拟机](7)---深入理解Class中-属性集合 那么这篇博客主要讲有关 方法表集合 相关的理解和代码示例. 方法表集合: 告知该方法是什么修饰符修饰?是否有方法值?返回类型是什么?方法名称,方法参数,还有就是方法内

如何理解Swift中Optional的 ! 和 ?

很多人在刚上手swift时对于Optional中 '!' 和 '?' 的使用十分不理解,接下来我会谈一谈自己对于这两个符号的使用方式的理解. 先来说说Optional的概念,以方便之后的理解.来看一下下面的代码: var a : String = nil // 编译错误,String类型不能为nilvar b : String = "Hello!"12Swift 中的普通类型不再能设为nil.那如何表示这个值不存在呢?所以引进了Optional的概念:代表 nil 或某个具体的值.例如

[翻译]理解Swift中的Optional

原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你第一次使用时可能会感到困惑.Optionals将会在编译阶段检查哪些值为nil.通过这种方式,你可以更好的保证应用程序交付在用户手里是可运行的.在Swift中,Optionals也提供了一些接口用来和遗留的Objective-C代码之间交互. 初试Optional 让我们在XCode中新建一个叫做s

Spark中map与flatMap

map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回 map函数的源码: def map(self, f, preservesPartitioning=False): """ Return a new RDD by applying a function to each element of this RDD. >>> rdd = sc.parallelize(["b", "a", &quo

【Swift】Map、FlatMap、CompactMap、CompactMapValues、Filter、Reduce

Map map函数能够被数组调用,它接受一个闭包作为参数,作用于数组中的每个元素.闭包返回一个变换后的元素,接着将所有这些变换后的元素组成一个新的数组 1. 比如我们有一个这样的需求遍历一个数组中所有的元素,将每个元素自身与自身相加,最后返回一个保存相加后元素的数组(-_-原谅我这表达能力,下面用代码阐述) 如果我们不使用map函数,那么代码如下 let numbers = [1,2,3] var sumNumbers = [Int]() for var number in numbers {

理解C++中的头文件和源文件的作用【转】

一.C++编译模式通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C++的源代码.C+ +语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里..cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做

java8中stream的map和flatmap的理解

转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"], 对于这样的需求,我们可能想到的第一个版本可能是这样子的: words

Swift 烧脑体操(四) - map 和 flatMap

前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困难.不过一切都是值得的,Swift 相比 Objective-C,写出来的程序更安全.更简洁,最终能够提高我们的工作效率和质量. Swift 相关的学习资料已经很多,我想从另外一个角度来介绍它的一些特性,我把这个角度叫做「烧脑体操」.什么意思呢?就是我们专门挑一些比较费脑子的语言细节来学习.通过「烧