【发布时间】:2017-09-09 15:56:14
【问题描述】:
我正在尝试在当前项目中尽可能多地使用 Scala 功能,但我很难在 Map 定义中使用模式匹配。
为了说明这一点,请考虑以下代码 sn-p:
class Foo(val element: Option[Any], val element2: Any, ...)
val bar = new Foo(...)
val map = Map(bar.element match {
case None => ??? // Do not add an item here
case Some(el) => "element" -> el
}, "element2" -> element2, ...
)
我在这段代码 sn-p 中遇到的问题是 None 的情况。如何指定此处不应添加任何元素?
我已经尝试了几件事:
- 我不能在这里引入
{},因为它会被解释为Unit。 - 在
case None =>后面留一个空格会导致类型不匹配;因为它也被视为Unit,而我们需要Tuple2。 - 我可以在
Map定义之后执行模式匹配,只在Some(el)的情况下添加一个元素。但是,这并不是一种非常优雅的方式。 - 我可以完全省略
case None =>,但这会产生警告,因为匹配并不详尽,如果元素确实是None,则会失败。
如果我想涵盖 Map 定义中的所有情况,我该如何指出在None 的情况下,不应添加任何元素?
一些上下文:我将它用作(akka)喷雾 json 协议定义的一部分,用于某种类型,并且想知道是否有一种速记方法可以做到这一点,而不需要有条件地向地图添加元素。
提前致谢!
编辑:建议的解决方案
根据mavarazy 的回答,我通过如下代码解决了这个问题:
class Foo(val element: Option[Any], val element2: Any, ...)
val bar = new Foo(...)
val map = Map(bar.element match {
case None => "" -> null // Do not add an item here
case Some(el) => "element" -> el
}, "element2" -> element2, ...
).filter(_._2 != null)
从未想过这样做,但我认为它仍然有些优雅。谢谢!
【问题讨论】:
标签: scala dictionary pattern-matching