У меня есть следующий фрагмент кода:
val map = new LinkedHashMap[String,String]
map.put("City","Dallas")
println(map.get("City"))
Здесь выдается Some(Dallas)
вместо Dallas
. В чем проблема с моим кодом?
Спасибо
У меня есть следующий фрагмент кода:
val map = new LinkedHashMap[String,String]
map.put("City","Dallas")
println(map.get("City"))
Здесь выдается Some(Dallas)
вместо Dallas
. В чем проблема с моим кодом?
Спасибо
Используйте метод 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
Это не проблема.
В то время как версия 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 для получения дополнительных полезных свойств.
Есть еще два способа обработки результатов 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)