2017-02-14 145 views
1

我必須根據某些條件更新地圖中的密鑰。值不會被修改。斯卡拉更新密鑰

我已經結束了與此代碼,但並不顯得利落對我來說,有沒有這樣做的任何更好的選擇:

val newOpt = inOpt("type") match { 

    case "mydb" => 
    inOpt map { case (key, value) => (

     if (key.contains(XXXX)) { 
     key.replace("A", "B") 
     } 
     else if(...){..} 
     else { 
     key 
     } 


     , value) 
    } 
} 

所有舊鍵和值將在沿更新的密鑰newOpt。

問候

+0

您能否詳細說明爲什麼要這麼做?如果你定期這樣做,在Map中改變一個*鍵*對我來說有點奇怪,你爲什麼需要這樣做? –

+0

其不定期,只有在有需要時... – Garipaso

+0

而不是地圖,用例類,並根據需要更新值需要 – Jet

回答

1

至少你可以在updateKey邏輯分離到不同的功能,也可能使用模式來匹配if else

val newMap = originalMap map { case (key, value) => (updatedKey(key), value)}

至少它看起來更清潔,但不一定比你的解決方案。

class UpdateKeysSpecs extends FunSuite { 

    test("updates the keys") { 
    val originalMap : Map[String, String]= Map("key1" -> "value1", 
     "key2_old" -> "value2", 
     "key3_something" -> "value3") 

    val newMap = originalMap map { case (key, value) => (updatedKey(key), value)} 

    assert(newMap.keys == Set("key1", "key2_new", "key3_nothing")) 
    } 

    def updatedKey(key: String): String = { 
    key.contains("old") match { 
     case true => key.replace("old", "new") 
     case false => { 
     key.contains("something") match { 
      case true => key.replace("something", "nothing") 
      case false => key 
     } 
     } 
    } 
    } 
} 
5

試試這個

val m = Map(1->"hi",2->"Bye") 
scala.collection.immutable.Map[Int,String] = Map(1 -> hi, 2 -> Bye) 

更新的關鍵2 5

m.map{x=> if(x._1 == 2) (5 -> x._2) else x} 
scala.collection.immutable.Map[Int,String] = Map(1 -> hi, 5 -> Bye) 
0

對於

val m = Seq((1,2),(11,22)).toMap 
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 11 -> 22) 

創建基於在mupdated新地圖,

val m2 = m.updated(11,23) 
m2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 11 -> 23)