Scala學習之相同的函數名

最近在慢慢的開始用Scala寫Spark,剛開始也是在菜鳥教程上簡單過了一遍Scala,現在還記得一些基本語法,還有各種奇怪的語法糖。想要更快的學習這門語言,還是需要自己多謝謝。

今天在看別人代碼時,發現他在類中定義了兩個名字一模一樣的函數,但是我還以爲他寫錯了。當我以Python的思維去看待這們語言時,當然是在作死的邊緣了。

舉一個簡單的栗子,從MongoDB讀取數據時使用的配置所定義的兩個函數

def readConfig(context: SparkContext, database: String, collection: String): ReadConfig = {
    ReadConfig(Map("database" -> database, "collection" -> collection),
      Some(ReadConfig(context)))
  }

  def readConfig(session: SparkSession, database: String, collection: String): ReadConfig = {
    ReadConfig(Map("database" -> database, "collection" -> collection),
      Some(ReadConfig(session)))
  }

可以看到兩個函數名一樣的,剛開始我也很懵逼,但是仔細一看,他的參數是不一樣的,一個是context: SparkContext,一個是session: SparkSession。這兩個函數的功能一樣,但是接受的參數不一樣,所以這才需要去定義兩個函數。(試想一下,在Python中如何去實現)

可能你不懂Scala,讓我簡單跟你講一下。首先我們使用def關鍵字定義了一個名爲readConfig的函數,和Python一模一樣;然後就是函數接受的參數了,可以看到在每個參數後面有冒號,這個冒號就表示前面的數據類型,比如定義一個相加函數

object add{
   def addInt(a:Int, b:Int) : Int = {
      var sum:Int = 0
      sum = a + b
      return sum
   }}

Scala會在變量後定義類型,這樣就可以區別不同的函數了。

回到上面的栗子,一個類型是SparkContext,一個是SparkSession,這是Spark的數據類型;然後我們可以看到在函數末尾是冒號加ReadConfig,這裏說的返回的數據類型是ReadConfig,也就是從MongoDB讀取數據時使用的配置類型。(如果是Unit則不用返回任何數據,和Java類似)

是不是很好理解,在調用函數時,只要我們傳遞的第一個參數是不同類型,就會使用相應的函數。

都說Scala是一種函數式語言,函數是 Scala 語言的核心,看看Scala函數的特性,不說了,繼續擼Scala了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章