Подтвердить что ты не робот

Scala Карта # get и возврат Some()

Im использует функцию 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() вокруг этого.

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

4b9b3361

Ответ 1

Существует много способов справиться с типом 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

Ответ 2

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