Scala基础4-偏函数,模式匹配,样例类,伴生,抽象,特质

偏函数

偏函数函数体:

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}")
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值