模式匹配:功能编程中最强大的工具

245 阅读2分钟

在这篇文章中,我们将介绍什么是模式匹配,什么时候应该使用它,最后,我们将把它与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相比,它需要更多的编译时间。