scala学习笔记(三)——模式匹配和样例类

Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。类似于Java的switch语句,但更加强大

语法  val  a mathc{

case xxxx = > xxx

case xxxx=> xxx}

并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配

1、匹配字符串

import scala.util.Random

object CaseDemo01 extends App{
  val arr = Array("Hadoop", "HBase", "Spark")
  val name = arr(Random.nextInt(arr.length))
  name match {
    case "Hadoop" => println("哈肚普...")
    case "HBase" => println("H贝斯...")
    case _ => println("真不知道你们在说什么...")//类似于default
  }}

2、匹配类型

import scala.util.Random

object CaseDemo01 extends App{
  //val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"
  val arr = Array("hello", 1, 2.0, CaseDemo01)
  val v = arr(Random.nextInt(4))
  println(v)
  v match {
    case x: Int => println("Int " + x)
    case y: Double if(y >= 0) => println("Double "+ y)
    case z: String => println("String " + z)
    case _ => throw new Exception("not match exception")
  }
}

3、匹配数组、元组、集合

object CaseDemo03 extends App{

  val arr = Array(1, 3, 5)
  arr match {
    case Array(1, x, y) => println(x + " " + y)
    case Array(0) => println("only 0")
    case Array(0, _*) => println("0 ...")
    case _ => println("something else")
  }

  val lst = List(3, -1)
  lst match {
    case 0 :: Nil => println("only 0")
    case x :: y :: Nil => println(s"x: $x y: $y")
    case 0 :: tail => println("0 ...")
    case _ => println("something else")
  }

  val tup = (2, 3, 5)
  tup match {
    case (2, x, y) => println(s"1, $x , $y")
    case (_, z, 5) => println(z)
    case  _ => println("else")
  }
}

4、样例类case class

在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的

import scala.util.Random

case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask


object CaseDemo04 extends App{
  val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))

  arr(Random.nextInt(arr.length)) match {
    case SubmitTask(id, name) => {
      println(s"$id, $name")//字符串组合方式
    }
    case HeartBeat(time) => {
      println(time)
    }
    case CheckTimeOutTask => {
      println("check")
    }
  }
}

样例类主要用于模式匹配,在RPC中使用,案例这里

本质上来讲,class  case class用起来就是一样的:
最不一样的一个东西:如果我们scala要做模式匹配,去匹配类型的话,建议使用
case case 因为scala的底层对它做了优化,匹配起来性能较好。
* 1:case class 自动生成伴生对象,自动实现了apply方法
* 2:case class 用于做匹配,性能较好(scala的底层做过优化)
* 3:case class 默认实现了序列化Serializable
* 4: case class 默认实现了toString equals等方法

* 5:case class 主构造函数 里面没有修饰符,默认的是val


偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,与常规相比省略了match关键字,常用作输入模式匹配

 def func1: PartialFunction[String, Int] = {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }





你可能感兴趣的:(Scala)