Scala中的map和flatMap

版权声明:版权声明中 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
    

猜你喜欢

转载自blog.csdn.net/lds_include/article/details/88980564
今日推荐