在这篇文章中,我们将介绍什么是模式匹配,什么时候应该使用它,最后,我们将把它与if-else进行比较。
什么是模式匹配?
模式匹配是Scala中最强大的工具之一。它类似于 switch语句,但与switch语句相比,它具有大量的功能。
定义
模式匹配基本上是一个case语句的序列,每个case语句都定义了一个模式和表达式,只要有匹配就会调用。
让我们举个例子
package com.knoldus.patternMatching
object patternMatching extends App{
def typeMatching(x:Any)= {
x match {
case i:Integer => "It's an integer: " + i
case s:String => "It's a string: " + s
case b:Boolean => "Its a boolean: " + b
case _ => "Something Else"
}
}
println(typeMatching(45.569))
println(typeMatching("Knoldus"))
println(typeMatching(false))
println(typeMatching(21))
}
程序的输出
Something Else
It's a string: Knoldus
Its a boolean: false
It's an integer: 21
解释:
我们正在将一个对象与另一个对象进行比较,每个case语句由一个模式组成,在我们的例子中是整数、字符串、布尔值和_(通配符,用作默认情况),表达式由模式的"=>"箭头符号分隔。
我们什么时候应该使用模式匹配?
面向对象的编程教会了我们把所有的东西都封装到一个对象中,所以我们把方法和数据结构都封装起来。
封装后,我们忽略了数据结构,对于每一个新的功能,我们都要添加一个新的方法。
当我们被要求包括过量的使用类似的数据结构时,主要的问题就出现了,我们作为一个整体知道每个有用的东西都与新方法直接相关。
所以为了解决这个问题,我们遵循功能化的方法。
模式匹配帮助你将数据结构解构为它们的组成部分。
让我们举一个例子
package com.knoldus.patternMatching
object Deconstruct extends App{
case class Employee(name:String, engineerLevel:Int)
val person = Employee("Patrick", 3)
val secondPerson = Employee("Izzie", 2)
val employeeDetail = person match {
case Employee(n, l) => s"Hi my name is $n and I am a level $l engineer"
case _ => "May be you are an Intern"
}
println(employeeDetail)
}
输出
Hi my name is Patrick and I am a level 3 engineer
模式匹配和if-else哪个更好?
好吧,模式匹配确实比if-else强大得多,因为它有大量的功能,而且Scala开发者也被建议选择模式匹配而不是if-else。
那么这是否意味着我们应该完全抛弃if-else呢?
嗯,不完全是,如果你正在处理布尔值,那么建议你使用if-else,因为布尔值在类型层面上并没有传达任何信息。
如果我们使用模式匹配,编译器会产生大量的代码,从而导致更多的内存消耗,与if-else相比,它需要更多的编译时间。