问题描述
从 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
}
您可以通过实现 unapply
和 unapplySeq
来使用自定义匹配器和解构器:
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 中 switch
与 if
的个人偏好将有助于您在 Scala 中选择 match
与 if
。
Scala match
允许以下内容:
- 对同一个值进行多次测试
- 测试类型和结构以及价值
- 在测试期间提取值
- 更干净、更易读的代码
如果您不需要这些,那么 if
可能是更好的选择。
另请记住,字节码的大小并不是衡量性能的重要指标,因为任何对性能很重要的代码都会被 JIT 编译为本机代码。