2017-02-14 10 views
1

Мне нужно обновить ключи на карте, основываясь на определенном состоянии. значения не будут изменены.ключи обновления в scala

Я закончил с этим кодом, но не выглядит аккуратным мне, есть ли лучшая альтернатива делать это:

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

Можете ли вы подробнее рассказать о том, почему вы хотите это сделать? Изменение * клавиши * в «Карте» кажется мне странным, если вы делаете это регулярно, зачем вам это нужно? –

+0

его не на регулярной основе, только когда это необходимо ... – Garipaso

+0

Вместо карты используйте класс case и обновите значения в соответствии с потребностью – 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) 

Update ключ 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) 

создать новую карту, основанную на m с updated,

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