收集单个值的多个部分函数的结果?

Ark*_*kin 2 scala pattern-matching partialfunction

假设我有一些可能有重叠域的部分函数:

val funcs: Seq[PartialFunction[Any, Int]] = Vector(
{ case i: Int if i % 2 == 0 => i*2 }
,
{ case i: Int if i % 2 == 1 => i*3 }
,
{ case i: Int if i % 6 == 0 => i*5 }
)
Run Code Online (Sandbox Code Playgroud)

我想将它们应用于一个值,并收集该val定义的任何结果.我认为有一种优雅的方式可以collect用于此,但我能做的最好的方法是

val num = 66
funcs.collect { case func if func.isDefinedAt(num) => func(num) }
// or 
funcs.filter(_.isDefinedAt(num)).map(_(num))
Run Code Online (Sandbox Code Playgroud)

这看起来不干净.有没有办法使用内置案例机制来测试定义和同时评估,可能是通过将它们与测试值或类似的东西进行对比?

Ako*_*chy 7

部分函数有一个lift方法,即Some(res)PF是否已定义,None如果未定义.另外,使用flatMap我们基本上可以忽略Nones并只抓取Some值.

funcs.flatMap { func => func.lift(num) }
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢那种东西就压缩:

funcs.flatMap(_.lift(num))
Run Code Online (Sandbox Code Playgroud)