Fork me on GitHub

Scala学习之相同的函数名

1
这是崔斯特的第六十八篇原创文章

最近在慢慢的开始用Scala写Spark,刚开始也是在菜鸟教程上简单过了一遍Scala,现在还记得一些基本语法,还有各种奇怪的语法糖。想要更快的学习这门语言,还是需要自己多谢谢。

今天在看别人代码时,发现他在类中定义了两个名字一模一样的函数,但是我还以为他写错了。当我以Python的思维去看待这们语言时,当然是在作死的边缘了。

举一个简单的栗子,从MongoDB读取数据时使用的配置所定义的两个函数

1
2
3
4
5
6
7
8
9
10
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一模一样;然后就是函数接受的参数了,可以看到在每个参数后面有冒号,这个冒号就表示前面的数据类型,比如定义一个相加函数

1
2
3
4
5
6
7
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了。