要从模式匹配中返回选项,请使用Try?

DCS*_*DCS 1 scala pattern-matching

我有很多的模式匹配代码如下所示:如果有些Foo比赛,一SomeBar返回,否则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.

我的问题是,对于我不知道的后一种方法是否存在某些(例如性能)惩罚.

Mic*_*jac 9

第二个版本的可读性较差,而且不太正确*.Try如果您只是要将错误丢弃,那么使用就没有太大意义了None.该Try唯一没有赶上匹配误差,并将它们转换为None,但你可以做,在一个像case _ => None.

会有更多的开销包装Try,但不足以解决问题.首先应该是正确性和可读性.

如果你真的不希望有额外的情况下,可以考虑包装yOption使用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)

使用collectOption会包裹在被定义的部分功能的情况下Some,和不匹配将成为任何情况下None.


*通过正确,我的意思是广泛接受的使用Try.