scala中的flatMap和foldLeft函数
scala由于其函数式编程的特性,在大数据的处理中被广泛使用。
此文针对scala集合中两个常用的,却不太好理解的函数进行示例讲解。
flatMap
scala中最重要的函数之一,映射扁平化
把握以下三点即可:
1、flatMap = map + flatten
2、什么类型调用的flatMap方法,则返回的也是什么类型
3、先对集合中的每个元素进行map,
再对map后的每个元素(map后的每个元素必须还是集合)中的每个元素进行flatten
[注] 进行map的对象可以是只含一层的集合,但进行flatten操作的对象必需是至少含两层的集合
map和flatten示例:
scala
1 | object Test0001 { |
flatMap示例一:
scala
1 | val words = Set("scala", "spark", "hadoop") |
flatMap示例二:
scala
1 | val tuples: List[(String, Int)] = List(("Hello Scala", 4), ("Hello Spark", 2)) |
flatMap示例三:
scala
1 | val linesList = List(("Hello Scala", 4), ("Hello Spark", 2)) |
根据上述三个原则即可算出函数结果。
foldLeft
集合折叠函数,fold、foldRight底层都是基于foldLeft函数。
所以本文用到的函数可以不用严格区分,主要阐述其原理。
scala
1 | def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) |
就是将集合的数据和集合之外的数据进行聚合操作。
fold方法有函数柯里化,有2个参数列表
第一个参数列表:集合之外的数据
第二个参数列表:表示计算规则
fold示例一:
scala
1 | val list = List(1, 2, 3, 4) |
fold示例二:
scala
1 | object Scala21_Collection_Method4 { |
原理示意图如下:
总结:
其实,在foldleft函数中,第二个参数规定的就是,
foldleft第一个参数和foldleft调用者的第一个元素的运算规则
可以用如下公式理解:
a. foldLeft( b )( (b,a的第一个元素)=>{} )
(对应上面示意图:红色块为b,蓝色块为a)
只不过在此公式中b和a的第一个元素都是动态变化的:
b一直在迭代,a会继续往后顺序取后面的值。
其实函数最终返回值就是b的值(上面的例子map1和map3相等也能证明这一点,本质就是map1把值赋给了map3),且a不发生改变。







