zoukankan      html  css  js  c++  java
  • Scala模式匹配和样例类

    Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

    1、字符匹配

        def main(args: Array[String]): Unit = {

          val charStr = '6'

          charStr match {

            case '+' => println("匹配上了加号")

            case '-' => println("匹配上了减号")

            case '*' => println("匹配上了乘号")

            case '/' => println("匹配上了除号")

              //注意。所有的模式匹配都必须最终匹配上一个值,如果没有匹配上任何值,就会报错

           // case _  => println("都没有匹配上,我是默认值")

          }

        }

    2、 匹配字符串

        def main(args: Array[String]): Unit = {

          val arr = Array("hadoop", "zookeeper", "spark")

          val name = arr(Random.nextInt(arr.length))

          name match {

            case "hadoop"    => println("大数据分布式存储和计算框架...")

            case "zookeeper" => println("大数据分布式协调服务框架...")

            case "spark" => println("大数据分布式内存计算框架...")

            case _ => println("我不认识你...")

          }

       

    }

       

    3、守卫

    模式匹配当中,我们也可以通过条件进行判断

            def main(args: Array[String]): Unit = {

             var ch = "500"

             var sign = 0

             ch match {

             case "+" => sign = 1

             case "-" => sign = 2

             case _ if ch.equals("500") => sign = 3

             case _ => sign = 4

             }

             println(ch + " " + sign)

            }

       

    4、 匹配类型

       

    def main(args: Array[String]): Unit = {

    //注意泛型擦除,在模式匹配当中的类型匹配中,除了Array类型以为,所有的其他的数据类型都会被擦除掉

    val a = 3

    val obj = if(a == 1) 1

    else if(a == 2) "2"

    else if(a == 3) BigInt(3)

    else if(a == 4) Map("aa" -> 1)

    else if(a == 5) Map(1 -> "aa")

    else if(a == 6) Array(1, 2, 3)

    else if(a == 7) Array("aa", 1)

    else if(a == 8) Array("aa")

    val r1 = obj match {

    case x: Int => x

    case s: String => s.toInt

    case BigInt => -1 //不能这么匹配

    case _: BigInt => Int.MaxValue

    case m: Map[String, Int] => "Map[String, Int]类型的Map集合"

    case m: Map[_, _] => "Map集合"

    case a: Array[Int] => "It's an Array[Int]"

    case a: Array[String] => "It's an Array[String]"

    case a: Array[_] => "It's an array of something other than Int"

    case _ => 0

    }

    println(r1 + ", " + r1.getClass.getName)

    }

       

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

    def main(args: Array[String]): Unit = {

    val arr = Array(0, 3, 5)

    arr match {

    case Array(0, x, y) => println(x + " " + y)

    case Array(0) => println("only 0")

    //匹配数组以1 开始作为第一个元素

    case Array(1, _*) => 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 = (1, 3, 7)

    tup match {

    case (1, x, y) => println(s"1, $x , $y")

    case (_, z, 5) => println(z)

    case _ => println("else")

    }

    }

       

    注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。

    9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表

    注意:: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

    6、 样例类

    样例类首先是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明。样例类主要是使用在我们后面的sparkSQL当中,通过样例类来映射我们的表当中的对象

    定义形式:

    case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)

    case object 类型,是单例的。 case object Person

          

       

    case class SubmitTask(id: String, name: String)

    case class HeartBeat(time: Long)

    case object CheckTimeOutTask

    //1、样例类当中的主构造器参数默认为val

    //2、样例类当中的applyunapply方法自动生成

    object CaseDemo04 extends App {

    val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))

    arr(2) match {

    case SubmitTask(id, name) => {

    println(s"$id,$name")

    println(id)

    println(name)

    println(id+" "+name)

    }

    case HeartBeat(time) => {

    println(time)

    }

    case CheckTimeOutTask => {

    println("check")

    }

    }

    }

    7、偏函数

    被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。

                    val func1: PartialFunction[String, Int] = {

                     case "one" => 1

                     case "two" => 2

                     // case _ => -1

                    }

                      

                    def func2(num: String) : Int = num match {

                     case "one" => 1

                     case "two" => 2

                     case _ => -1

                    }

                      

                    def main(args: Array[String]) {

                     println(func1("one"))

                     println(func2("one"))

                     //如果偏函数当中没有匹配上,那么就会报错,我们可以通过isDefinedAt来进行判断

                     // println(func1("three"))

                     println(func1.isDefinedAt("three"))

                     if(func1.isDefinedAt("three")){

                     println("hello world")

                     }else{

                     println("world hello")

                     }

                    }

       

       

  • 相关阅读:
    TD
    TD
    required
    Cookie
    cookie 与 session区别
    折线图
    <a>标签
    十六进制颜色表
    js获取当前页面的url网址信息
    stopPropagation() 方法
  • 原文地址:https://www.cnblogs.com/starzy/p/10466585.html
Copyright © 2011-2022 走看看