Scala中如何优化双变量的多分支if-else条件判断逻辑?
Scala多层if-else优化方案
Scala没有传统多变量switch语句,但原生支持的模式匹配是替代多分支判断的标准函数式实现,完全支持多变量组合匹配,可以完美替代你当前的多层if-else堆叠逻辑。
方案1:元组模式匹配(最简洁,和原逻辑完全等价)
首先需要注意你原代码中使用的&是按位与运算符,不会触发短路逻辑,这里应该替换为逻辑与&&。优化后代码如下:
def fooOutput(v1: Double, v2: Int): Int = (v1, v2) match { case (_, _) if v1 >= 9 && v2 >= 2 => 5 case (v, _) if v >= 8 => 4 case (v, _) if v >= 4 => 3 case _ => 2 }
匹配顺序和你原有的if-else判断顺序完全一致,逻辑100%对齐,可读性远高于多层if-else嵌套。
方案2:偏函数组合(适合后续规则需要频繁扩展的场景)
如果后续业务规则会不断新增,可以将每个判断逻辑拆分为独立的偏函数,再通过orElse组合执行,完全符合开闭原则:
// 每个规则独立定义 val ruleGreaterEqual9WithV2Ge2: PartialFunction[(Double, Int), Int] = { case (v1, v2) if v1 >= 9 && v2 >= 2 => 5 } val ruleGreaterEqual8: PartialFunction[(Double, Int), Int] = { case (v1, _) if v1 >= 8 => 4 } val ruleGreaterEqual4: PartialFunction[(Double, Int), Int] = { case (v1, _) if v1 >= 4 => 3 } val defaultRule: PartialFunction[(Double, Int), Int] = { case _ => 2 } // 组合规则执行 def fooOutput(v1: Double, v2: Int): Int = List( ruleGreaterEqual9WithV2Ge2, ruleGreaterEqual8, ruleGreaterEqual4, defaultRule ).reduce(_ orElse _).apply((v1, v2))
这种写法后续新增规则只需要新增偏函数实例并加到规则列表中即可,不需要修改原有判断逻辑,扩展性更强。
内容的提问来源于stack exchange,提问作者Dariusz Krynicki
相关产品推荐
相关产品推荐

