scala中HashMap的map方法

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é)果是相同的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容