• Scala模式匹配


    模式匹配
      Java:switch case 值 对一个值进行条件判断,返回针对不同的条件进行不同的处理
      Scala:match case 值/类型/集合

    基本语法:
    变量 match {
      case value1 => 代码1
      case value2 => 代码2
      .....
      case _ => 代码N
    }


    object MatchApp extends App {

      val names = Array("Akiho Yoshizawa", "YuiHatano", "Aoi Sola")
      val name = names(Random.nextInt(names.length))   //随机取一个名字

      name match {
        case "Akiho Yoshizawa" => println("吉老师...")
        case "YuiHatano" => println("波老师...")
        case _ => println("真不知道你们在说什么...")
      }

      def judgeGrade(grade:String): Unit = {
        grade match {
          case "A" => println("Excellent...")
          case "B" => println("Good...")
          case "C" => println("Just so so...")
          case _ => println("You need work harder...")
        }
      }

      judgeGrade("A")
      judgeGrade("C")
      judgeGrade("D")
    }


    加条件进行匹配:

    object MatchApp extends App {
      def judgeGrade(name:String, grade:String): Unit = {
        grade match {
          case "A" => println("Excellent...")
          case "B" => println("Good...")
          case "C" => println("Just so so...")
          case _ if(name == "lisi") => println(name + " , You are a good boy, but...")    //这里右多了一层判断
          case _ => println("You need work harder...")
        }
      }

      judgeGrade("zhangsan", "D")
      judgeGrade("lisi", "D") //双重过滤
    }


    Array模式匹配:
    object MatchApp extends App {
      def greeting(array:Array[String]): Unit = {
        array match {
          case Array("zhangsan") => println("Hi:zhangsan")
          case Array(x,y) => println("Hi: " + x + " , " + y)
          case Array("zhangsan", _*) => println("Hi:zhangsan and other friends...")    //zhangsan开头的任意个的一个数组。
          case _ => println("Hi: everybody...")
        }
      }

      greeting(Array("zhangsan"))    //走第一个case
      greeting(Array("lisi", "wangwu"))    //走第二个case
      greeting(Array("zhangsan","lisi", "wangwu"))   //走第三个case
      greeting(Array("lisi", "zhangsan", "wangwu"))    //走第四个case
    }


    List模式匹配:
    object MatchApp extends App {
      def greeting(list:List[String]): Unit = {
        list match {
          case "zhangsan" :: Nil => println("Hi:zhangsan")
          case x::y::Nil => println("Hi:" + x + " , " + y)
          case "zhangsan" :: tail => println("Hi: zhangsan and other friends...")
          case _ => println("Hi:everybody...")
        }
      }

      greeting(List("zhangsan"))   //走的第一个case
      greeting(List("lisi", "zhangsan"))   //走的第二个case
      greeting(List("zhangsan","lisi"))    //走的第二个case,先匹配上这个了。因为顺序的问题,所以没有做第三个case,而是走了第二个case。
      greeting(List("PK","zhangsan","lisi"))    //走的第四个case
    }


    类型匹配:Scala能根据类型做匹配

    object MatchApp extends App {
      def matchType(obj:Any): Unit = {
        obj match {
          case x:Int => println("Int")
          case s:String => println("String")
          case m:Map[_,_] => m.foreach(println)
          case _ => println("other type")
        }
      }

      matchType(1)    //Int, 走的第一个case
      matchType("1")    //String,走的第二个case
      matchType(1f)    //other type ,走的第四个case
      matchType(Map("name" -> "PK"))    //(name,PK), 走的第三个case
    }

    Scala异常处理:
    object ExceptionApp extends App {

      //IO
      val file = "test.txt"

      try{

        // open file
        // use file

        val i = 10/0    //是会报错的,不能被0除,需要用try catch。
        println(i)
      } catch {
        case e:ArithmeticException => println("除数不能为0..")
        case e:Exception => println(e.getMessage)
      } finally {
        //释放资源,一定能执行: close file
      }
    }

    这就是我们常用的一个处理步骤,把要处理的东西丢到try里面,然后在catch里面通过 case 这种方式把我们的异常给捕获到,该怎么处理就是业务逻辑层面的问题了。最后把释放资源写到finally就行了。


    case class模式匹配: case class不用new的,直接就能使用。

    object CaseClassApp extends App {
      def caseclassMatch(person:Person): Unit = {
        person match {
          case CTO(name,floor) => println("CTO name is: " + name + " , floor is : " + floor)
          case Employee(name,floor) => println("Employee name is: " + name + " , floor is : " + floor)
          case _ => println("other")
        }
      }
      class Person
      case class CTO(name:String, floor:String) extends Person
      case class Employee(name:String, floor:String) extend Person
      case class Other(name:String) extend Person

      caseclassMatch(CTO("PK", "22"))
      caseclassMatch(Employee("zhangsan", "2"))
      caseclassMatch(Other("other"))
    }


    Some、None 模式匹配:

    object CaseClassApp extends App {

      val grades = Map("PK"->"A", "zhangsan"->"C")

      def getGrade(name:String): Unit = {
        val grade = grades.get(name)

        grade match {
          case Some(grade) => println(name + ": your grade is :" + grade)
          case None => println("sorry....")
        }
      }
      getGrade("zhangsan")   //zhangsan: your grade is : C
      getGrade("PK")    //PK: your grade is : A
      getGrade("lisi")    //sorry....
    }

  • 相关阅读:
    C# 应用程序性能监测器,很不错的工具
    C#接口(interface)与类(class)的实例互相转换深度解析
    异步与线程深度解析
    内存管理:程序是如何被优雅的装载到内存中
    MacBookM1通过DockerDesk安装MySQL8容器
    理解异步编程体系
    asp.net导入excel方法大集合
    无法激活服务,因为它不支持 ASP.NET 兼容性
    Oracle 数据库 在asp.net中 插入时间
    微软发布更新包 修复SilverLight中的6个问题
  • 原文地址:https://www.cnblogs.com/green-frog-2019/p/11354966.html
Copyright © 2020-2023  润新知