Scala:模式匹配与 if-else

问题描述

从 Java 迁移到 Scala,可以看到使用模式匹配来分支代码,这是通过 Java 中的 if-else 实现的。但 Scala 也提供 if-else。

代码可读性而言,我个人更喜欢 if-else。此外,谷歌搜索表明为模式匹配生成的字节码要大得多。

那么在什么情况下人们应该更喜欢一种?

解决方法

模式匹配比 if/else 和 java 的 switch 语句强大得多。 您可以使用它优雅地检查对象类型:

foo match {
   case i: Int => i
   case f: Double => Math.round(f*100) 
   case s: String => s.toInt 
}

您可以解构复杂的对象:

foo match {
   case SomeObject(AnotherObject(_,_,bar),baz) => bar -> baz
   case head :: tail => head -> tail
   case Seq(a,b,c,_ rest@_*) => (a,c) -> rest
}

您可以通过实现 unapplyunapplySeq 来使用自定义匹配器和解构器:

foo match {
   case PrimeNumber(next,_@_*) => print(s"$foo is prime,next is $next")
   case Compound(primes@_*) => print(s"$foo is compound: ${primes.mkString("*")}=$foo"
}

您可以将它们用作声明部分函数以解构参数的快捷方式:

   stuff.zipWithIndex.collect { case (foo,idx) if idx % 2 == 0 => foo }

等等。 (很多,可能会使用)。我不确定字节码的大小……坦率地说,我不知道为什么我会关心。如果这些大小差异很重要,我可能会写“C”或汇编。

,

Java 还提供了 switch,因此在 Java 中也出现了类似的问题。您对 Java 中 switchif 的个人偏好将有助于您在 Scala 中选择 matchif

Scala match 允许以下内容:

  1. 对同一个值进行多次测试
  2. 测试类型和结构以及价值
  3. 在测试期间提取值
  4. 更干净、更易读的代码

如果您不需要这些,那么 if 可能是更好的选择。

另请记住,字节码的大小并不是衡量性能的重要指标,因为任何对性能很重要的代码都会被 JIT 编译为本机代码。