DCS*_*DCS 1 scala pattern-matching
我有很多的模式匹配代码如下所示:如果有些Foo
比赛,一Some
的Bar
返回,否则None
,有大量的Foos
长构造函数Bars
.就像是:
y match {
case Foo1(z) => Some(Bar1(z))
case Foo2(z) => Some(Bar2(z))
case Foo3(z) => Some(Bar3(z))
case Foo4(z) => Some(Bar4(z))
case _ => None
}
Run Code Online (Sandbox Code Playgroud)
在实际代码中,箭头右侧的构造函数更复杂,并且有更多情况.
现在,为了摆脱重复的选项构造函数(Some
),我可以做到:
Try(
y match {
case Foo1(z) => Bar1(z)
case Foo2(z) => Bar2(z)
case Foo3(z) => Bar3(z)
case Foo4(z) => Bar4(z)
}
).toOption
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来更清晰,从语义角度看它是合理的,因为case _
它实际上是一种不应该发生的情况,因此将其建模为异常似乎是合理的.请注意,重复Somes
是我的错误,而不是最后一次case
.
我的问题是,对于我不知道的后一种方法是否存在某些(例如性能)惩罚.
第二个版本的可读性较差,而且不太正确*.Try
如果您只是要将错误丢弃,那么使用就没有太大意义了None
.该Try
是唯一没有赶上匹配误差,并将它们转换为None
,但你可以做,在一个像case _ => None
.
会有更多的开销包装Try
,但不足以解决问题.首先应该是正确性和可读性.
如果你真的不希望有额外的情况下,可以考虑包装y
中Option
使用collect
:
Option(y) collect {
case Foo1(z) => Bar1(z)
case Foo2(z) => Bar2(z)
case Foo3(z) => Bar3(z)
case Foo4(z) => Bar4(z)
}
Run Code Online (Sandbox Code Playgroud)
使用collect
上Option
会包裹在被定义的部分功能的情况下Some
,和不匹配将成为任何情况下None
.
*通过正确,我的意思是广泛接受的使用Try
.
归档时间: |
|
查看次数: |
61 次 |
最近记录: |