如何在Scala中将多个大小写表达式链接在一起

如何在Scala中将多个大小写表达式链接在一起,scala,Scala,我需要一个类型为:Int=>String的函数,如下所示: valh:Int=>String={ 案例1=>“一” 案例2=>“两个” 案例u=>“u” } 为了更好的模块化,我想将其分解为如下内容: val handler1:PartialFunction[Int,String]={ 案例1=>“一” } val handler2:PartialFunction[Int,String]={ 案例2=>“两个” } val handlerX:PartialFunction[Int,String

我需要一个类型为:
Int=>String
的函数,如下所示:

valh:Int=>String={
案例1=>“一”
案例2=>“两个”
案例u=>“u”
}
为了更好的模块化,我想将其分解为如下内容:

val handler1:PartialFunction[Int,String]={
案例1=>“一”
}
val handler2:PartialFunction[Int,String]={
案例2=>“两个”
}
val handlerX:PartialFunction[Int,String]={
案例u=>“u”
}
val h:Int=>String={
handler1.orElse(handler2.orElse(handlerX)
}
我的问题是:
1) 大小写匹配的性能差异(降级)有多大
2) 有没有更好的方法达到同样的目的?或者至少我们可以简化上述版本?重复相同的类型声明很乏味。

我不明白您的第二个变体是如何改进模块化的,但好吧,让我们假设它确实

不要重复同样的类型,你可以这样做

val handlers: List[PartialFunction[Int, String] ] = List(
  { case 1 => "one" },
  { case 2 => "two" },
  { case 3 => "three" },
  { case 4 => "four" },
  { case 5 => "five" },
  { case 6 => "six" },
  {case _ => "_"}
)

val h = handlers.foldLeft[PartialFunction[Int, String]](null)((agg, f) => {
  if (agg == null) f else agg.orElse(f)
})

性能会下降,但即使在10万次使用中,也不会超过50 mls…因此,这取决于此代码将经过多少次迭代,以及什么差异对您至关重要。

据我所知,编译器无法优化很多这样的函数组合,因此,可以预见会出现性能下降(简单的patmat与具有多个调用的Composition),要知道某个因素是否会影响您的性能,唯一真正的方法就是测量它。它可能会慢一些,但可能根本不重要。另一种选择是使用一些Map[String,Int]并将它们组合在一起。我在这里只使用
reduce
,以避免
null
。或者
def(I:Int):String={val it=handlers.iterator;def g:String=it.next().applyOrElse(I,(\u:Int)=>g);g}
。我知道,
orElse
确实是
applyOrElse