【问题标题】:Scala Map#get and the return of Some()Scala Map#get 和 Some() 的返回
【发布时间】:2021-07-30 18:49:21
【问题描述】:

我正在使用 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()。

有什么建议吗?

【问题讨论】:

标签: scala map


【解决方案1】:

有很多方法可以处理Option 类型。然而,首先,要意识到拥有这个而不是潜在的null 参考有多好!不要仅仅因为你习惯了 Java 的工作方式就试图摆脱它。

正如其他人最近所说:坚持几个星期,每次你不得不回到一种不提供Option 类型的语言时,你都会抱怨。

现在至于你的问题,最简单和最冒险的方法是这样的:

mymap.get(something).get

Some 对象上调用 .get 会检索内部的对象。但是,如果您使用的是 None(例如,如果键不在您的地图中),它确实会给您一个运行时异常。

更简洁的方法是像这样使用Option.foreachOption.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

【讨论】:

  • mymap(something) 看起来更漂亮。
  • @elbowich:是的,当您知道something 肯定包含在地图中时,mymap(something) 似乎是一个不错的选择。
【解决方案2】:

我个人喜欢使用.getOrElse(String),并使用“无”之类的默认值,即.getOrElse("None")

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,替换为 .Key() 来解决。 解决方案: 定义图(选择)

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多