match表达式
类似于Java switch语句
能处理所有类型
不需要break
能够生成值
val firstArg = if(args.length > 0) args(0) else ""
firstArg match {
case "salt" => println("pepper")
case "chips" => println("salsa")
case "eggs" => println("bacon")
case _ => println("huh?") // 以上末列出的值,使用"_"表示
}
样例类的模式匹配
模式匹配
检查某个值是否匹配某一个模式的机制,一个成功的匹配同时会匹配值解构为其组成部分
// 基本模式匹配
def matchTest(x:Int):String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
matchTest(3) // many
matchTest(1) // one
// 模式守卫(在模式后面加上if条件)
def matchTest2(x:Int):String = x match {
case i if i == 1 => "one"
case i if i == 2 => "two"
case _ => "many"
}
matchTest2(3) // many
matchTest2(1) // one
// 仅匹配类型
def matchTest3(x:Any):String = x match {
case x:Int => "Int"
case x:String => "String"
case _ => "Any"
}
matchTest3(3,0) // Any
matchTest3(1) // Int
// 样例类的模式匹配
def matchTest4(x:Student) = x match {
case Student(name,19) => println(name)
case Student("Tom",age) => println(age)
case Student(name,age) => println(name,age)
case _ => println("no matches")
}
matchTest4(Student("Jason",19)) // Jason
matchTest4(Student("Tom",20)) // 20
matchTest4(Student("Jimmy",20)) // Jimmy,20
非样例类的模式匹配
单例对象中指定unapply()方法时,称为提取器对象(Extractor Objects)
unapply()方法接受一个实例对象,返回最初创建它所用的参数
class Student(_name:String,_age:Int) {
var name = _name
var age = _age
}
object Stduent {
def apply(name:String,age:Int):Student = new Student(name,age)
def unapply(arg:Student):Option[(String,Int)] = {
if(arg == null) None
else Some(arg.name,arg.age)
本文深入探讨Scala中的模式匹配,包括基本语法、模式守卫、类型匹配及样例类的模式匹配,通过具体示例讲解如何在Scala中使用match表达式进行高效的数据处理。
277

被折叠的 条评论
为什么被折叠?



