¿Cómo iterar el mapa de Scala?

81

Tengo mapa scala:

attrs: Map[String , String]

Cuando trato de iterar sobre el mapa como;

attrs.foreach { key, value =>     }

lo anterior no funciona. En cada iteración debo saber cuál es la clave y cuál es el valor. ¿Cuál es la forma correcta de iterar sobre scala map usando scala syntactic sugar?

as
fuente

Respuestas:

72

foreachEl método recibe Tuple2[String, String]como argumento, no 2 argumentos. Entonces puedes usarlo como tupla:

attrs.foreach {keyVal => println(keyVal._1 + "=" + keyVal._2)}

o puede hacer coincidir el patrón:

attrs.foreach {case(key, value) => ...}
tenshi
fuente
6
mire la respuesta de Rex, hay mejores opciones allí
iwein
156

Tres opciones:

attrs.foreach( kv => ... )          // kv._1 is the key, kv._2 is the value
attrs.foreach{ case (k,v) => ... }  // k is the key, v is the value
for ((k,v) <- attrs) { ... }        // k is the key, v is the value

El truco es que la iteración le brinda pares clave-valor, que no puede dividir en un nombre de identificador de clave y valor sin usar caseo for.

Rex Kerr
fuente
1

He agregado algunas formas más de iterar los valores del mapa.

// Traversing a Map
  def printMapValue(map: collection.mutable.Map[String, String]): Unit = {

    // foreach and tuples
    map.foreach( mapValue => println(mapValue._1 +" : "+ mapValue._2))

    // foreach and case
    map.foreach{ case (key, value) => println(s"$key : $value") }

    // for loop
    for ((key,value) <- map) println(s"$key : $value")

    // using keys
    map.keys.foreach( key => println(key + " : "+map.get(key)))

    // using values
    map.values.foreach( value => println(value))
  }
Ranga Reddy
fuente