初识scala(四)

1.模式匹配

匹配内容

    val a=Array("A","B","C")
    val name= a(Random.nextInt(a.length))
//    println(name)

    name match {
      case "A" =>println("a")
      case "B" =>println("b")
      case _ => println("other")
          }

匹配类型

    def matchType(obj:Any) =obj match {
      case x:Int =>println("Int")
      case s:String =>println("String")
      case m:Map[_,_] =>println("Map")
      case _ =>println("other")
    }

    matchType(1)
    matchType("asdf")
    matchType(Map("asdf"-> 12))
    matchType(1D)

集合匹配

    def matchList(list: List[String]): Unit ={
      list match {
        case "ruoze":: Nil => println("ruoze") //只能匹配”ruoze“一个元素
        case x::y:: Nil => println(s"$x,$y")//能匹配集合中两个元素
        case "ruoze":: tail => println("ruoze.....")//匹配ruoze开头的
        case _ => println("123")
      }
    }
    matchList(List("ruoze"))
    matchList(List("x","y"))
    matchList(List("x","y","z"))
    matchList(List("ruoze","123"))

匹配case

  /**
    * case class   必须要有参数列表
    * case object  不能加参数列表
    *
    * case 跟class区别
    * case class重写了toString ,equals hashCode方法
    * case class默认实现了序列化
    * case class不用new
    *
    * Trait 类似于理解java的Interface
    *
    */

    val casecalss= Array(SubmitTask("1","task"),HeartBeat(10000),OutofTime)

    casecalss(Random.nextInt(casecalss.length)) match{
      case SubmitTask(id,name) => println("SubmitTask")
      case HeartBeat(time) => println("HeartBeat")
      case OutofTime => println("OutofTime")
    }
    try{
      1/0
    }catch {
//      case e:Exception =>println(e.getMessage)
//      case e:Exception =>println(e.getStackTrace)
      case e:ArithmeticException =>println("除数不能为0")
      case e:Exception =>e.printStackTrace()
    }finally {
      //最后资源的释放,一定会执行
      //close
    }
    case class SubmitTask(id:String,name:String)
    case class HeartBeat(time:Long)
    case object OutofTime

2.偏函数

/**
    * 偏函数 PartialFunction
    *包在花括号内没有match的一组case语句
    * A: 输入参数类型
    * B:输出参数类型
    */


  def main(args: Array[String]): Unit = {
    val a=Array("A","B","C")
    val name= a(Random.nextInt(a.length))


    println(say(name))
  }
   def say:PartialFunction[String,String]={
     case "A" => "a"
     case "B" => "b"
     case _ =>  "other"
   }

3.隐式转换

从class Man的定义中可以看出,定义里并没有fly方法,这个时候编译器就会开始找是否有对应的隐式转换可用,根据参数找到implicit def man2superman(man: Man)这个函数,再在里面调用Superman类里面的fly方法。
隐式类型

implicit def man2superman(man: Man): Superman = new Superman(man.name)
      val man = new Man("jepson")
      man.fly()

class Man(val name:String){
}

class Superman(val name:String){
  def fly(): Unit ={
    println(s"$name flying")
  }
}

隐式参数

def sayhello(name:String)=println(s"$name")
    //隐式参数 方法/函数的参数可以使用implicit
    def sayhello2(implicit name:String ="若泽")=println(s"$name")
//    sayhello("ruoze")
    //多个隐式转换只需要写一个
    def add1(x:Int)(implicit y:Int,z:Int)=x+y+z
    
    implicit val ad:Int=5
    println(add(3))

隐式类

    implicit class Cal(x:Int){
      def add(a:Int)=a+x
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值