Spark 中 关于scala 语法理解的问题


    val lines: Dataset[String] = session.read.textFile("")
    val words: Dataset[String] = lines.flatMap(_.split(" "))
    
    上面lines是一个dataSet对象,flatMap方法是dataSet中定义的一个方法,上面两行代码在IDEA下没报错误。flatMap如下:
    
    
      def flatMap[U : Encoder](func: T => TraversableOnce[U]): Dataset[U] =
    mapPartitions(_.flatMap(func))
    
    
   
    

问题:
_.split(" ") 相当于一个函数,传入参数是String类型,返回类型是split的结果类型 Array[String],

而flatmap方法定义为接收 func: T => TraversableOnce[U] , 显然这里的T是String类型,
而 Array[String] 并不是TraversableOnce[U] 类型,因为Array 没有实现TraversableOnce 这个特质,

所以我的问题是: 为什么 我传入 _.split(" ") 这样一个函数 给flatMap,flatMap却没有报错??

简而言之就是我传入的方法 类型,和flatMap 需要的方法类型 好像是不匹配的,不是吗?

阅读 5.7k
2 个回答
新手上路,请多包涵

scala通过隐式转换默认调用了iterator 方法转换为一个可迭代的对象(Array(1,2,3).iterator)

flatMap需要一个实现了一交遍历接口的类型或返回这个类型的函数,_.split("")返回的是list, list也实现了TraversableOnce,所以类型是匹配的。

final def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): List[B]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题