我偶尔会遇到以下模式,其中我基本上有一个PartialFunction[SomeType,AnotherType],并想将其视为Function[SomeType,Option[AnotherType],例如:

def f(s:SomeType):Option[AnotherType] = s match {
  case s1:SubType1 => Some(AnotherType(s1.whatever))
  case s2:SubType2 => Some(AnotherType(s2.whatever))
  case _ => None
}

有没有一种方法可以避免上面提到的默认情况,并将结果包装在Some定义的地方,从而编写上述函数?到目前为止,我想出的最好的方法是:
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)
}

有没有定义中间函数的方法?我已经按照以下方式尝试了各种方法,但是还没有任何可编译的内容:
def f:Function[SomeType,Option[AnotherType]] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}.lift

最佳答案

对象scala.PartialFunction中的condOpt。从scaladoc:

def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }

09-13 09:43