Scala Map # get и возвращение Some ()

scala map

29780 просмотра

2 ответа

Я использую Map#getфункцию Scala , и для каждого точного запроса он возвращает как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.)

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

Какие-нибудь советы?

Автор: meriley Источник Размещён: 12.11.2019 09:15

Ответы (2)


34 плюса

Решение

Есть много способов борьбы с 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
Автор: Frank Размещён: 22.02.2012 06:15

0 плюса

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

Автор: Albaro Pereyra Размещён: 11.01.2019 02:04
Вопросы из категории :
32x32