【Scala流程控制】10、Scala中的Switch语句模式匹配

在这里插入图片描述

在Scala中,没有像传统编程语言(如Java或C/C++)中的switch语句那样的直接构造。Scala中的替代方案是使用match表达式,它提供了更强大和灵活的模式匹配功能。match表达式可以用于根据不同的条件执行不同的代码块。

一个模式匹配的简单应用是作为多级if-else 语句的替代,这可以提高代码的可读性。模式匹配不使用关键字switch,Scala使用关键字match。每个可能的匹配由关键字case 处理。如果有一个case 被匹配到,那么右箭头右侧的代码被执行。其中下划线_代表默认case。如果前面没有一个case 匹配上的话,默认case 的代码会被执行。与switch 语句不同,在每个case 后的代码不需要break 语句。只有匹配的case 会被执行。另外,每个=>右侧的代码是一个表达式,返回一个值。因此,一个模式匹配语句本身是一个表达式,返回一个值。

一、模式匹配

match表达式的基本语法如下:

val variable = ... // 要匹配的变量或表达式
variable match {
    
    
  case pattern1 => // 匹配pattern1时执行的代码块
  case pattern2 => // 匹配pattern2时执行的代码块
  // more cases...
  case _ => // 默认情况,用于处理其他未匹配的情况
}

其中:

  • variable是要进行匹配的变量或表达式。
  • case pattern1 =>是一个模式匹配,用于匹配特定的条件,并在匹配成功时执行相应的代码块。如果variable匹配pattern1,则执行对应的代码块。
  • 可以有多个case语句,分别匹配不同的模式。
  • case _ =>是一个默认情况,用于处理所有其他未匹配的情况。类似于switch语句中的default情况。

二、case语句单条件匹配

示例:

val x = 2
val result = x match {
    
    
  case 1 => "One"
  case 2 => "Two"
  case 3 => "Three"
  case _ => "Other"
}

println(result) // 输出:"Two"

在上述示例中,match表达式根据变量x的值进行模式匹配,如果x匹配到case 2 =>,则返回字符串"Two"。

三、case语句多条件匹配

在Scala的match表达式中,可以使用case匹配多个条件,这样可以在一个case语句中处理多种情况。可以使用逗号 , 分隔多个模式,同时在一个case代码块内处理这些模式匹配的情况。

示例如下:

scalaCopy codeval x = 2
val result = x match {
  case 1 | 2 | 3 => "One, Two or Three" // 使用 | 分隔多个条件
  case 4 | 5 | 6 => "Four, Five or Six"
  case _ => "Other"
}

println(result) // 输出:"One, Two or Three"

在上述示例中,case 1 | 2 | 3 =>表示将模式匹配分为三个条件:1、2和3。如果x的值是1、2或3,将执行相应的代码块。

四、搭配if

除了使用|运算符连接多个条件外,还可以使用if条件在同一个case语句中对多个条件进行更复杂的筛选。

match表达式还可以结合使用if条件进行更复杂的模式匹配,也可以匹配复杂的数据结构,如集合、元组等。

val y = (1, 2)
val message = y match {
    
    
  case (1, 2) => "Tuple with (1, 2)"
  case (a, b) if a > b => "First element is greater than second element"
  case (a, b) if a < b => "First element is less than second element"
  case _ => "Other"
}

println(message) // 输出:"Tuple with (1, 2)"

在上述示例中,match表达式匹配一个元组(1, 2)并返回相应的消息。if条件用于进一步筛选匹配的元组。

总的来说,match表达式是Scala中替代switch语句的功能强大的模式匹配工具。它在处理复杂条件和多种情况时提供了更多的灵活性和表现力。

五、匹配集合类型

在Scala的match表达式中,可以使用case匹配集合类型,包括ListArraySeq等。可以使用case语句来匹配集合的不同元素和结构,并在不同的匹配情况下执行相应的代码块。

示例如下:

val myList = List(1, 2, 3)

val result = myList match {
    
    
  case List(1, 2, 3) => "List contains 1, 2, and 3 in order"
  case List(a, b, c) => s"List contains elements: $a, $b, $c"
  case List(_, _, _) => "List contains three elements, but not 1, 2, 3 in order"
  case Nil => "Empty list"
  case _ => "Other"
}

println(result) // 输出:"List contains 1, 2, and 3 in order"

在上述示例中,myList是一个List类型的集合。match表达式使用case语句来匹配不同的集合情况。List(1, 2, 3)用于匹配包含1、2和3的顺序列表。List(a, b, c)用于匹配包含任意三个元素的列表,并将其绑定到变量abc,用于后续代码块的使用。List(_, _, _)用于匹配包含任意三个元素的列表,但不考虑元素的具体值。

除了Listmatch表达式还可以用于匹配其他集合类型,例如ArraySeq等。下面是一个匹配Array类型的示例:

val myArray = Array(1, 2, 3)

val result = myArray match {
    
    
  case Array(1, 2, 3) => "Array contains 1, 2, and 3 in order"
  case Array(a, b, c) => s"Array contains elements: $a, $b, $c"
  case Array(_, _, _) => "Array contains three elements, but not 1, 2, 3 in order"
  case Array() => "Empty array"
  case _ => "Other"
}

println(result) // 输出:"Array contains 1, 2, and 3 in order"

在上述示例中,myArray是一个Array类型的集合,match表达式使用case语句来匹配不同的数组情况。

通过使用case匹配集合类型,可以在match表达式中对不同集合情况进行处理,使代码更具灵活性和可读性。

猜你喜欢

转载自blog.csdn.net/m0_47256162/article/details/132159551
今日推荐