偏函数
偏函数函数体:
def 函数名:PartialFunction[类型]={
case ...
}
模式匹配
def 函数名(参数):返回类型={
匹配的字段 match{
case ...
}
}
- 示例1
def cas2(a:Int,b:String):Unit={
a match {
case 1 if b=="胶囊"=> println("1号胶囊")
case 1 if b=="口服液"=> println("1号口服液")
case 2 => b match {
case "胶囊" => println("2号胶囊")
case "口服液" => println("2号口服液")
case _ => println("输入错误")
}
case _ => println("输入错误")
}
}
cas2(1,"ab")
- 示例2
def cas4(a:Int):Char ={
if (a>=90) 'A'
else if (a>80 && a<90) 'B'
else 'C'
}
def cas5(a:Int)={
cas4(a) match {
case 'A' => println("优秀")
case 'B' => println("良好")
case 'C' => println("及格")
case _ => println("不及格")
}
}
cas5(99)
样例类
case class Teacher(name: String, age: Int)
def mat5(teacher: Teacher) = teacher match {
case Teacher("green", 37) => println("hello green teacher")
case Teacher("kb11", 6) => println("hello kb11 teacher")
case x: Teacher => println(s"hello ${x.name}")
}
class Person
case class Teacher2(name:String,age:Int) extends Person
case class Worker(name:String,age:Int) extends Person
case class Student(name:String,age:Int) extends Person
def mat10(person: Person)={
person match {
case Teacher2(name,21) => println(name)
case Worker(name,age) if name=="abc" => println(s"修理工$age")
case p:Student if p.name=="ooo" => println("ooo")
case _ => println("不知道是什么")
}
}
- 练习
case class Student(name:String,age:Int) extends Person
def cas3(stu: Student)={
stu.name match {
case "张3" => println(s"${stu.name}的年龄为${stu.age}")
case _ => println("查无此人")
}
}
样例类输出异常
//异常
def mat7(e:Exception) = e match {
case e1:IndexOutOfBoundsException => println("数组下标越界")
case e2:NullPointerException => println("空指针异常")
case _ => println("Exception")
}
集合
//集合
def mat8(arr:Array[String])={
arr match {
case Array("kb11") => println("hello kb11")
case Array(s1,s2) => println(s1,s2)
case Array("kb12",_*) => println("第一个是kb12,后面有任意个")
case _ if arr.contains("abc") => println("包含abc")
case _ => println("不认识")
}
}
伴生类和伴生对象:
//伴生类
class 类名{
}
//伴生对象
object 类名{
}
和object名相同的class名,class是object的伴生类,object是class的伴生对象
class Test4(a:String,b:String){
println(4)
def show(): Unit ={
println(s"${a}和${b}")
}
def this(a:String){
this(a,"第二个默认的参数")
}
def this(){
this("第一个默认的参数")
}
}
object Test4 {
def show()={
println(3)
}
println(1)
println(2)
def main(args: Array[String]): Unit = {
// Test4.show() // 1 2 3
new Test4().show() // 1 2 4
}
}
伴生对象(除函数部分)->伴生类->伴生对象的函数
抽象和特质
//抽象类
abstract class 类名{
}
//特质
trait 特质名{
}
extends 抽象类名 with 特质名
类似于java的抽象和接口
- 示例
abstract class Pet {
def pingZhong:String
def weight:Int
}
trait Type1{
def jiao:String={
"叫"
}
}
trait Type2{
def jump:String={
"跳"
}
}
trait Type3{
def climb:String
}
class Dog extends Pet{
override def pingZhong: String = {
"狗"
}
override def weight: Int = {
10
}
}
class Cat extends Pet{
override def pingZhong: String = {
"猫"
}
override def weight: Int = {
8
}
}
object PetTest{
def main(args: Array[String]): Unit = {
val dog = new Dog
println(s"品种是${dog.pingZhong} 重量是${dog.weight}斤")
val cat = new Cat
println(s"品种是${cat.pingZhong} 重量是${cat.weight}斤")
}
}
特质可以在具体类实例化时with,也可以重写方法(匿名内部类)
abstract class Pet {
def pingZhong:String
def weight:Int
}
trait Type1{
def jiao:String={
"叫"
}
}
trait Type2{
def jump:String={
"跳"
}
}
trait Type3{
def climb:String
}
class Cat extends Pet{
override def pingZhong: String = {
"猫"
}
override def weight: Int = {
8
}
}
object PetTest{
def main(args: Array[String]): Unit = {
val dog1 = new Dog with Type1 with Type2
println(s"${dog1.pingZhong}会${dog1.jiao}也会${dog1.jump}")
val cat1 = new Cat with Type1 with Type2 with Type3 {
override def climb: String = {
"爬"
}
}
println(s"${cat1.pingZhong}会${cat1.jiao}也会${cat1.jump}还会${cat1.climb}")
}
}