Jak iterować mapę Scala?

81

Mam mapę Scala:

attrs: Map[String , String]

Kiedy próbuję iterować po mapie, jak;

attrs.foreach { key, value =>     }

powyższe nie działa. W każdej iteracji muszę wiedzieć, jaki jest klucz i jaka jest wartość. Jaki jest właściwy sposób iteracji mapy łuski przy użyciu cukru syntaktycznego łuski?

as
źródło

Odpowiedzi:

72

foreachmetoda otrzymuje Tuple2[String, String]jako argument, a nie 2 argumenty. Możesz więc użyć go jak krotki:

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

lub możesz dopasować wzór:

attrs.foreach {case(key, value) => ...}
tenshi
źródło
6
spójrz na odpowiedź Rexa, lepsze opcje
iwein
158

Trzy opcje:

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

Sztuczka polega na tym, że iteracja daje pary klucz-wartość, których nie można podzielić na klucz i nazwę identyfikatora wartości bez użycia caselub for.

Rex Kerr
źródło
2

Dodałem więcej sposobów iteracji wartości map.

// 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
źródło