传送门
Scala入门系列之一--使用命令行往文件输入数据并读取数据
Scala入门系列之二--数组、元组、列表、集合数据类型简述
Scala入门系列之三--类和方法的创建以及命令行执行scala文件
Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改
Scala入门系列之五--主构造器和辅助构造器
Scala入门系列之六--伴生对象和伴生类
Scala入门系列之七--scala中的继承
Scala入门系列之八--scala中的特质(trait),也称接口
Scala入门系列之九--模式匹配两大法宝(match语句和case类)
Scala入门系列之十--包
Scala入门系列之十一--函数式编程基础
Scala入门系列之十二--高阶函数
Scala入门系列之十三--针对容器的操作(遍历/映射/过滤/规约操作)
Scala入门系列之十四--使用IDEA编写Scala代码并Maven打包提交集群运行
传送门
一、match语句
1)可以根据关键词(或者说匹配特定的常量)去匹配相应的结果
import scala.io.StdIn._
println("Please input the score: ")
val grade = readChar()
grade match{
case 'A' => println("85-100")
case 'B' => println("70-84")
case 'C' => println("60-69")
case '' => println("<60")
case _=> println("error input") // 通配符_相当于java中的default分支
}
注:
1.match结构中不需要break语句来跳出判断,Scala从前往后匹配到一个分支后,会自动跳出判断
2.case后面的表达式可以是任何类型的常量,而不要求是整数类型
2)可以通过匹配某种类型(Int/Double/String)去匹配相应的结果
for (elem <- List(6,9,0.618,"Spark","Hadoop",'Hello)){
val str = elem match {
case i:Int => i + "is an int value."."//匹配整型的值,并赋值给i
case d:Double => d + " is a double value." //匹配浮点型的值
case "Spark" => "=>"Spark is found." //匹配特定的字符串
case s:String => s + " is a string value." //匹配其它字符串
case _=> "unexpected value:"+ elem //与以上都不匹配
}
println(str)
}
//结果
//6 is an int value.
//9 is an int value.
//0.618 is a double value.
//Spark is found.
//Hadoop is a string value.
//unexpected value:'Hello
3)除此之外,可以使用守卫式(grard)如if语句去进行一些过滤逻辑
for (elem <- List(1,2,3,4)){
elem match{
case if(elem % 2 == 0) => println(elem+"is even.")
case _=> println(elem + " is odd.")
}
}
//结果
//1 is odd.
//2 is even.
//3 is odd.
//4 is even.
二、case类
概念简述
- case类是一种特殊的类,它们经过优化以被用于模式匹配
- 当定义一个类时,如果在class关键字前加上case关键字,则该类称为case类
- Scala为case类自动重载了许多实用的方法,包括toString、equals和hashcode方法
- Scala为每一个case类自动生成一个伴生对象,其包括模板代码1个apply方法,因此,实例化case类的时候无需使用new关键字。和1个unapply方法,该方法包括一个类型为伴生类的参数返回的结果是Option类型,对应的类型参数是N元组,N是伴生类中主构造器参数的个数。Unapply方法用于对对象进行解构操作,在case类模式匹配中,该方法被自动调用,并将待匹配的对象作为参数传递给它。
//例如,假设有如下定义的一个case类:
case class Car(brand:String,price:Int)
//则编译器自动生成的伴生对象是:
object Car{
def apply(brand:String,price:Int) = new Car(brand,price)//起实例化的作用
def unapply(c:Car):Option[(String,Int)] = Some((c.brand,c.price))
}
//典例1:
case class Car(brand:String,price:Int){
val myBYDCar = Car("BYD", 89000)
val myBMWCar = Car("BMW", 1200000)
val myBenzCar = Car("Benz", 1500000)
for (car <- List(myBYDCar, myBMWCar, myBenzCar)){
car match{
case Car("BYD", 89000) => println("Hello, BYD!")
case Car("BMW", 1200000) => println("Hello, BMW!")
case Car(brand, price) => println(“Brand:”+ brand +“, Price:”+price+“, do you want it?”)
}
}
}
//结果
//Hello, BYD!
//Hello, BMW!
//Brand:Benz, Price:1500000, do you want it?
//注:这里都是调用unapply方法获取值,然后匹配值。三个都是这样,只不过最后一个是匹配所有的值,前面是匹配特定的值
三、练习
新建一个老师类 、一个学生类、一个陌生人类。老师类学生类参数名称为姓名年龄,陌生人类没有参数。
创建一个打卡系统,如果匹配到老师,学生,就放行, 如果学生年龄小于20再额外打印一条语句,如果匹配到陌生人就不放行
case class teacher(name:String,age:Int){}
case class student(name:String,age:Int){}
case class stranger(){}
object people{
def main(args:Array[String]){
val t = tracher("harry",25)
val s = student("tom",14)
val stranger = stranger()
for (a <- List(t,s,stranger)){
a match{
case teacher(name,age) => println("ok! Through")
case student(name,age)if(age < 20) => println("ok! Through and This is a small friend")
case student(name,age) => println("ok! Through and This is a big friend")
case _=> println("fail!")
}
}
}
}