版权声明:版权声明中 https://blog.csdn.net/lds_include/article/details/88980564
Scala中的map和flatMap
list中map和flatMap的实现:
-
map
- 源码
abstract class List[T]{ def map[U](f: T => U): List[U] = this match { case first :: last = f(first) :: last.map(f) case Nil = Nil }
- 说明:
- map会将每一条输入映射为一个新对象。{苹果,梨子}.map(去皮) = {去皮苹果,去皮梨子} 其中: “去皮”函数的类型为:A => B
- 举例:
//通过并行化生成rdd val rdd1 = sc.parallelize(List(5, 6, 4, 7, 3, 8, 2, 9, 1, 10)) //对rdd1里的每一个元素乘2然后排序 val rdd2 = rdd1.map(_ * 2).sortBy(x => x, true) //过滤出大于等于十的元素 val rdd3 = rdd2.filter(_ >= 10) //将元素以数组的方式在客户端显示 rdd3.collect
-
flatMap
- 源码
def flatMap[U](f: T => List[U]): List[U] = this match{ case x:: xs => f(x) ++ xs.flatMap(f) case Nil => Nil } }
- 说明:
- flatMap包含两个操作:会将每一个输入对象输入映射为一个新集合,然后把这些新集合连成一个大集合。 {{蛋糕,面包},{梨子,苹果}}.flatMap(切碎) = {切碎的蛋糕,切碎的面包片,切碎的苹果片,切碎的梨子片} 其中: “切碎”函数的类型为: A => List< B >
- 举例:
val rdd1 = sc.parallelize(Array("a b c", "d e f", "h i j")) //将rdd1里面的每一个元素先切分再压平 val rdd2 = rdd1.flatMap(_.split(' ')) rdd2.collect //来个复杂的: val rdd1 = sc.parallelize(List(List("a b c", "a b b"), List("e f g", "a f g"), List("h i j", "a a b"))) //将rdd1里面的每一个元素先切分并压平 val rdd2 = rdd1.flatMap(_.flatMap(_.split(" "))) rdd2.collect