2017-02-14 1 views
1

Je dois mettre à jour les clés dans une carte en fonction de certaines conditions. les valeurs ne seront pas modifiées.touches de mise à jour dans scala

J'ai fini avec ce code, mais ne semble pas propre à moi, est-il une meilleure alternative de le faire:

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) 
    } 
} 

Toutes les clés mises à jour ainsi que les anciennes clés et les valeurs seront en nouveauOpt.

Cordialement

+0

Pouvez-vous expliquer plus en détail pourquoi vous voulez faire cela? Changer une * clé * dans une «Carte» me semble un peu étrange si vous le faites régulièrement, pourquoi en avez-vous besoin? –

+0

ce n'est pas sur une base régulière, seulement quand jamais nécessaire ... – Garipaso

+0

Au lieu de Map, utilisez la classe de cas, et mettre à jour les valeurs selon le besoin – Jet

Répondre

1

Au moins vous pouvez séparer la logique updateKey à une autre fonction, vous pouvez également utiliser pour motif correspondant if else.

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

Au moins, il peut paraître plus propre, mais pas nécessairement une meilleure solution que le vôtre.

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

essayer cette

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

Mise à jour de la touche 2 avec 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

Pour

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

créer une nouvelle carte basée à m avec updated,

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