📜  Scala-模式匹配(1)

📅  最后修改于: 2023-12-03 15:05:04.827000             🧑  作者: Mango

Scala-模式匹配

模式匹配是Scala语言中的一种强大的功能,可用于将值与模式进行匹配,然后执行与匹配情况相对应的代码块。Scala的模式匹配类似于其他编程语言中的switch语句,但是在Scala中,模式匹配功能更强大,更灵活。

基本语法

Scala中的模式匹配语法基本上是通过match表达式实现的,该表达式由关键字match开头,后跟要匹配的值,然后是由case语句构成的一系列选项列表。例如,假设我们有如下代码:

val day = "Wednesday"
day match {
    case "Monday" => println("First day of the week")
    case "Tuesday" => println("Second day of the week")
    case "Wednesday" => println("Middle of the week")
    case "Thursday" => println("Fourth day of the week")
    case "Friday" => println("Fifth day of the week")
    case "Saturday" => println("Weekend!")
    case "Sunday" => println("Weekend!")
    case _ => println("Invalid day")
}

在上面的代码中,我们使用了一个变量day来接收一个字符串,然后在match表达式中将day与一系列字符串进行匹配。如果day与其中一个字符串匹配,则执行为该字符串编写的代码块。在这种情况下,由于day被设置为“Wednesday”,代码将匹配字符串“Wednesday”并打印“Middle of the week”。

在case语句的末尾,您还可以使用一个通配符_来捕获任何不匹配的情况,如上例中所示。

匹配对象

Scala中的模式匹配也可以用于匹配对象。假设我们有以下Person类:

case class Person(name: String, age: Int)

我们可以使用模式匹配来检查Person对象是否满足一些条件,例如年龄是否大于18岁:

val p = Person("John", 20)
p match {
    case Person(name, age) if age > 18 => println(s"$name is an adult")
    case Person(name, age) => println(s"$name is not an adult")
}

上面的代码中,我们使用了if语句在匹配时进行了进一步的过滤。如果Person对象的年龄大于18岁,则执行第一个case语句中的代码块,否则将执行第二个case语句中的代码块。

匹配列表

Scala中的模式匹配也可以用于匹配列表。例如,我们可以使用以下代码计算一个列表的总和:

val nums = List(1, 2, 3, 4, 5)
var total = 0
nums.foreach {
    case i: Int => total += i
    case _ => println("Not an integer")
}

在上面的代码中,我们通过一系列case语句来匹配列表中的元素。如果列表中的元素是整数,我们将其添加到变量total中。否则将打印"Not an integer"。

匹配类型

Scala中的模式匹配还可以用于匹配类型。例如,我们可以使用以下代码检查某个值的类型:

def matchType(x: Any): String = {
    x match {
        case s: String => s"String($s)"
        case i: Int => s"Int($i)"
        case f: Float => s"Float($f)"
        case b: Boolean => s"Boolean($b)"
        case _ => "Unknown type"
    }
}

在上面的代码中,我们定义了一个函数matchType,该函数接受一个任意类型的值x,并匹配该值的类型。如果值是字符串,则返回"String(值)",如果是整数,则返回"Int(值)",以此类推。如果值的类型与上述任何一种类型都不匹配,则返回"Unknown type"。

匹配样例类

Scala中的样例类是一种用于定义不可变数据的类。样例类提供了一种简便的方式来创建和使用只包含数据的类。例如,我们可以使用以下Person样例类来创建一个表示人的对象:

case class Person(name: String, age: Int)
val p = Person("John", 20)

在Scala中,样例类还可以作为模式匹配的数据类型。例如,我们可以使用以下代码检查Person对象是否满足某些条件:

p match {
    case Person("John", age) if age > 18 => println(s"$name is an adult")
    case Person(name, age) => println(s"$name is not an adult")
}

在上面代码中,我们使用Person样例类匹配Person对象。如果Person对象的名称为“John”且其年龄大于18岁,则执行第一个case语句中的代码块,否则将执行第二个case语句中的代码块。