Проблема с выводом значений карты в Scala - PullRequest
11 голосов
/ 17 июня 2011

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

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

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

Спасибо

Ответы [ 3 ]

18 голосов
/ 17 июня 2011

Используйте метод apply, он возвращает непосредственно String и выдает 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
12 голосов
/ 17 июня 2011

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

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

REPL в java, показывая, почему это полезно:

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 для получения дополнительной информации.

2 голосов
/ 17 июня 2011

Есть еще два способа обработки 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...