Проблема с отображением значений карты в scala

У меня есть следующий фрагмент кода:

val map = new LinkedHashMap[String,String]
map.put("City","Dallas")
println(map.get("City"))

Здесь выдается Some(Dallas) вместо Dallas. В чем проблема с моим кодом?

Спасибо

Ответ 1

Используйте метод apply, он возвращает непосредственно String и бросает a NoSuchElementException, если ключ не найден:

scala> import scala.collection.mutable.LinkedHashMap
import scala.collection.mutable.LinkedHashMap

scala> val map = new LinkedHashMap[String,String]
map: scala.collection.mutable.LinkedHashMap[String,String] = Map()

scala> map.put("City","Dallas")
res2: Option[String] = None

scala> map("City")
res3: String = Dallas

Ответ 2

Это не проблема.

В то время как версия Java Map использует null, чтобы указать, что ключ не имеет связанного значения, Scala Map[A,B].get возвращает Options[B], который может быть Some[B] или None, а None - аналогичная роль для java null.

REPL сеанс, показывающий, почему это полезно:

scala> map.get("State")
res6: Option[String] = None

scala> map.get("State").getOrElse("Texas")
res7: String = Texas

Или не рекомендуется, но просто get:

scala> map.get("City").get
res8: String = Dallas

scala> map.get("State").get
java.util.NoSuchElementException: None.get
        at scala.None$.get(Option.scala:262)

Обратитесь к документации Option для получения дополнительных полезных свойств.

Ответ 3

Есть еще два способа обработки результатов Option.

Вы можете сопоставить их:

scala> map.get("City") match {
 |   case Some(value) => println(value)
 |   case _ => println("found nothing")
 | }
Dallas

Или есть другой опрятный подход, который появляется где-то в Программе в Scala. Используйте foreach для обработки результата. Если результат имеет тип Some, то он будет использоваться. В противном случае (если он None) ничего не происходит:

scala> map.get("City").foreach(println)
Dallas

scala> map.get("Town").foreach(println)