scala真是一門有趣的語言,雖然編譯后的程序跟java一樣也運(yùn)行在JVM之上,但是scala可真不像java那樣易于理解,前兩天我就遇到了一個(gè)有趣的語法故事,是和scala中的集合類HashMap(Map也是一樣的)的map方法有關(guān)的,下面我將記錄下我的感受。
現(xiàn)象描述
在scala中有一個(gè)scala.collection.mutable.HashMap類,它可以存儲(chǔ)k-v對(duì),現(xiàn)在我新建了兩個(gè)Map,變量名字是ss和sse,里面存儲(chǔ)了一些內(nèi)容
object ScalaAPITest {
def main(args: Array[String]): Unit = {
val ss = Map("hh" -> "sss", "kk" -> "mmm")
val sse = Map("hh" -> "sss", "kk" -> "mmm")
}
}
現(xiàn)在我想要對(duì)這個(gè)ss中的內(nèi)容進(jìn)行更新操作,在ss中的每一個(gè)v的后面再加上一個(gè)字符串“ooooo”,然后將ss的內(nèi)容打印出來,于是代碼變成了下面這樣
object ScalaAPITest {
def main(args: Array[String]): Unit = {
val ss = Map("hh" -> "sss", "kk" -> "mmm")
val sse = Map("hh" -> "sss", "kk" -> "mmm")
val gg = ss.map(updateFun)
gg.foreach(showContent)
}
def updateFun(v: (String, String)):(String, String) ={
(v._1, v._2 + "ooooo")
}
def showContent(v: (String, String)):Unit ={
println(v._1 + "----" + v._2)
}
}
以上代碼可以正常運(yùn)行,并打印預(yù)期的結(jié)果,但是現(xiàn)在我要改變我想做的事情,我想將ss和sse中相同k的v相加起來存到ss中,這時(shí)再采用以上的方式似乎就做不到了,因?yàn)樵趗pdateFun中不能調(diào)用sse這個(gè)變量(雖然它是不變的,但是習(xí)慣了這么叫),于是就有了下面這種寫法:
object ScalaAPITest {
def main(args: Array[String]): Unit = {
val ss = Map("hh" -> "sss", "kk" -> "mmm")
val sse = Map("hh" -> "sss", "kk" -> "mmm")
val gg = ss.map{
case (k, v) => k -> {
val ve = sse.getOrElse(k, ("random", "random")) //在這里可以調(diào)用sse
v + ve
}
}
gg.foreach(showContent)
}
def showContent(v: (String, String)):Unit ={
println(v._1 + "----" + v._2)
}
}
大家可以從上面的代碼看出這樣做的好處,就是利用了模式匹配的方式是的可以在ss.map{}這個(gè)函數(shù)體里面調(diào)用sse,而在ss.map()中是做不到的。
這是一個(gè)很讓我興奮的地方,但是還不止這一個(gè),還有另一個(gè)地方,請(qǐng)看下面一段代碼:
object ScalaAPITest {
def main(args: Array[String]): Unit = {
val ss = Map("hh" -> "sss", "kk" -> "mmm")
val sse = Map("hh" -> "sss", "kk" -> "mmm")
val gg = ss.map{
case (k, v) => {
val ve = sse.getOrElse(k, ("random", "random")) //在這里可以調(diào)用sse
(k, v + ve)
}
}
gg.foreach(showContent)
}
def showContent(v: (String, String)):Unit ={
println(v._1 + "----" + v._2)
}
}
請(qǐng)注意觀察這段代碼和上一段代碼中不一樣的地方,差異出現(xiàn)在case語句和它的方法體中,而這兩段代碼的達(dá)成的結(jié)果是相同的。