Scala Map # get и возвращение Some () - PullRequest
20 голосов
/ 22 февраля 2012

Я использую функцию scala Map#get, и для каждого точного запроса он возвращает Some[String]

. Есть ли простой способ удалить Some?

Пример:

def searchDefs{
    print("What Word would you like defined? ")
    val selection = readLine
    println(selection + ":\n\t" + definitionMap.get(selection))
  }

Когда я использую этот метод и использую следующий ввод:

What Word would you like defined? Ontology

Возвращаемое значение:

Ontology:
    Some(A set of representational primitives with which to model a domain of knowledge or discourse.)

Я хотел бы удалить Some ()вокруг этого.

Любые советы?

Ответы [ 2 ]

34 голосов
/ 22 февраля 2012

Существует множество способов справиться с типом Option. Прежде всего, однако, осознайте, насколько лучше иметь это вместо потенциальной null ссылки! Не пытайтесь избавиться от него просто потому, что вы привыкли к тому, как работает Java.

Как недавно сказал кто-то другой: придерживайтесь этого в течение нескольких недель, и вы будете стонать каждый раз, когда вам придется вернуться к языку, который не предлагает Option типов.

Теперь, что касается вашего вопроса, самый простой и рискованный способ:

mymap.get(something).get

Вызов .get для объекта Some извлекает объект внутри. Это, однако, дает вам исключение времени выполнения, если вместо этого у вас был None (например, если ключ не был на вашей карте).

Гораздо чище использовать Option.foreach или Option.map, например:

scala> val map = Map(1 -> 2)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> map.get(1).foreach( i => println("Got: " + i))
Got: 2

scala> map.get(2).foreach( i => println("Got: " + i))

scala> 

Как видите, это позволяет вам выполнять оператор, если и только если у вас есть фактическое значение. Если Option равно None, ничего не произойдет.

Наконец, также популярно использовать сопоставление с образцом на Option типах, подобных этому:

scala> map.get(1) match {
     |  case Some(i) => println("Got something")
     |  case None => println("Got nothing")
     | }
Got something
0 голосов
/ 11 января 2019

Мне лично нравится использовать .getOrElse(String) и использовать что-то вроде "None" в качестве значения по умолчанию, т.е. .getOrElse("None").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...