Option[Map[String, String]] 可以奇怪地得到一个值

Posted

技术标签:

【中文标题】Option[Map[String, String]] 可以奇怪地得到一个值【英文标题】:Option[Map[String, String]] can get a value weirdly 【发布时间】:2013-04-24 21:57:48 【问题描述】:

我发现Option[Map[String, String]] 的工作方式很奇怪:

 scala> val fileInfo: Option[Map[String, String]] = Some(Map( "type" -> "hoge" ))
 fileInfo: Option[Map[String,String]] = Some(Map(type -> hoge))

 scala> fileInfo.get("type")
 res1: String = hoge

我认为Option“get”方法不接受任何参数,所以这对我来说非常奇怪。为什么它有效?它是隐式转换还是错误?我想确定它是如何工作的。

我的规格是:

Scala 版本 2.9.2 Java 1.6.0_43

【问题讨论】:

【参考方案1】:

这对fileInfo.get.apply("type") 进行了脱糖处理,也就是说,您并没有真正将参数传递给Option#get,而是在结果上调用.apply("type")

【讨论】:

【参考方案2】:

Scala 允许您 omit braces in some cases 并且您已经成为此功能创建的模棱两可的受害者:您所做的只是展开 Option(并获取底层 Map)- Option 不仅广泛使用 .getOrElse , 但也是不安全的 .get 方法,当没有 None 时会失败并出现异常:

val fileInfo: Option[Map[String, String]] = Some(Map( "type" -> "hoge" ))
val map = fileInfo.get
// map: Map[String,String] = Map(type -> hoge)
// now actual map lookup
map("type")
// res0: String = hoge

// but this obviously won't work
val throwy: Option[Map[String, String]] = Option(null) // None
throwy.get("type")
// java.util.NoSuchElementException: None.get

【讨论】:

谢谢。是的,那段代码是我同事写的。一看到代码,我就像出车祸了……这种情况下我不喜欢糖语法,所以我说服他像你的sn-p一样改变他的代码。【参考方案3】:
fileInfo.get("type")

翻译成:

fileInfo.get().apply("type")

因此,您打开选项,然后在Map 上获取一个元素。 (apply 获取非可选的映射元素,即如果键不存在则失败)。

【讨论】:

谢谢。你的答案也不错,但接受的答案比你的要快。

以上是关于Option[Map[String, String]] 可以奇怪地得到一个值的主要内容,如果未能解决你的问题,请参考以下文章

java8 stream, map, Option 等函数式编程的使用例子

java8 stream, map, Option 等函数式编程的使用例子

使用带.map()和.getOrElse()的选项

好程序员大数据教程分享Scala系列之Option_偏函数_String

Scala toMap类型转换问题

对flatMap / Map转换的理解感到困惑