zoukankan      html  css  js  c++  java
  • scala学习之模式匹配

    scala中有一个灰常强大的东西,叫做模式匹配。可以理解为Switch,只是比它更加强大。

      var sign = -1
      val ch:Char = '+'
      /**
       * 模式匹配:更好用的switch
       */
      ch match {
        case '-' => sign = -1
        case '+' => sign = 1
        case _ => sign = 0
      }

    和switch不同的是,没一个匹配条件后面,不需要break(想到当年写switch,忘记break的痛苦经历、、、),不会掉入下一个分支。
    如果想要添加多个case标签,可以不用从case’0’写道case’9’,可以向下面这样做:

      ch match {
        case '-' => sign = -1
        case '+' => sign = 1
        case _ if Character.isDigit(ch) => sign = Character.digit(ch,10)
        case _ => sign = 0
      }

    类型模式

      //类型模式
     var obj : Any = 1024
      var o = obj match {
        case x:Int => x
        case s:String =>Integer.parseInt(s)
        case _:BigInt =>Int.MaxValue
        case _ => 0
      }

    列表、元组、数据匹配

      var sth = arr match {
        case Array(0) => "0" //这个只能匹配Array(0)
        case Array(x, y) => x + " " + y //匹配任何带有2个元素的数组
        case Array(0, _*) => "0..." //任何以0开始的数组
        case _ => "something else"
      }
    
      val lkt = List(0, -3, -5, 7, 8)
      var value = lkt match {
        case 0 :: Nil => "0"
        case x :: y :: Nil => x + " " + y
        case 0 :: tail => "0..."
        case _ => "something else"
      }
    
    
      var pair = (0, 1)
      pair match {
        case (0, _) => "0..."
        case (y, 0) => y + "0"
        case _ => "neither is zero"
      }

    变量中的模式匹配

    val (q,r) = BigInt(10) /% 3

    上面代码中,会将商和余数分别赋值给q,r
    for循环中的模式匹配

      for ((k, v) <- System.getProperties())
        println(k + "->" + v)
      for ((k, "") <- System.getProperties())
        println(k)
    
      for ((k, v) <- System.getProperties() if v=="")
        println(k)

    第二个和第三个for循环只会打印value为空的K键

    样例类

        abstract class Amount
      val amt:Amount = new Dollar(11.2)
      case class Dollar (value: Double) extends Amount
      case class Currency(value:Double,unit: String) extends Amount
      case object Nothing extends Amount
    
      var v = amt match {
        case Dollar(v) => "$" + v
        case Currency(_,u) => ""+u
        case Nothing => ""
      }

    当声明样例类时,会有以下几件事情自动发生

    构造器中每一个参数都成为val,除非显示声明为var
    在伴生对象中提供apply方法,可以不用new关键字构造出相应对象,比如:Dollar(11.2)
    将自动生成toString,hashCode,equals,copy等方法,除非有该方法的定义

    copy方法

      val am = Currency(29.25,"EUR")
      val price = am.copy(value = 19.25) //Currency(19.25,"EUR")
      val pr = am.copy(unit = "CHF") //Currency(29.25,"CHF")

    偏函数
    偏函数,一个并非对所有输入值都定义的函数

    val f:PartialFunction[Char,Int] = {case '+' => 1;case '-' => -1}
    用放荡不羁的心态过随遇而安的生活
  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/re-myself/p/5532482.html
Copyright © 2011-2022 走看看