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 等函数式编程的使用例子