I occasionally come across the following pattern, where I essentially have a PartialFunction[SomeType,AnotherType]
, and want to treat it as a Function[SomeType,Option[AnotherType]
, eg:
def f(s:SomeType):Option[AnotherType] = s match {
case s1:SubType1 => Some(AnotherType(s1.whatever))
case s2:SubType2 => Some(AnotherType(s2.whatever))
case _ => None
}
Is there a way to write the above function in a way that avoids the default case and wrapping the result in Some
where it's defined? The best I've come up with so far is this:
def f(s:SomeType):Option[AnotherType] = pf.lift(s)
def pf:PartialFunction[SomeType,AnotherType] = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
}
Is there a way to do it without defining an intermediate function? I've already tried various things along the lines of the following, but haven't got anything to compile yet:
def f:Function[SomeType,Option[AnotherType]] = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
}.lift
condOpt
in object scala.PartialFunction. From the scaladoc:
def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With