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

    模式匹配应用场景:switch语句,类型查询,析构,样例类

    一、更好的switch

      val ch :Char = '+'
    
      val sign =
      ch match{
        case '+' => 1
        case '-' => -1
        case _ => 0
      }
    
      println(sign)

    case _ 匹配其他情况,case 结尾不需要break跳出

    二、守卫

      val ch :Char = '9'
    
      var digit = 0
    
      val sign =
      ch match{
        case '+' => 1
        case '-' => -1
        case _ => 0
        case _ if Character.isDigit(ch) => digit = Character.digit(ch,10)
        //case _ => 0
      }
    
      println(sign,digit)

    守卫可以是任何Boolean条件; 匹配是顺序下来的,上面的例子是匹配不到守卫的。

    三、模式中的变量

    case _ 看做是这个特性的一个特殊情况。

    四、类型模式

      var str =1
    
      def f(s : Any) = s match{
        case i : Int => println("int="+i)
        case s : String=> println("str="+s)
        case m : Map[String,Int]=> println("map="+m)  //Map中的类型匹配是无效的
        case _ => println("unknown")
      }
    
      f(1)
      f("Hello")
      f(Map((1,2)))

    结果:

    int=1
    str=Hello
    map=Map(1 -> 2)

    Map中的类型匹配是无效的,结果为

    Map(1 -> 2)

    匹配发生在运行期,Java虚拟机中的泛型信息是被擦掉的。

    五、匹配数组、列表和元组

    数组:

      def f (str: Any) = str match{
        case Array() => "0"
        case Array(x,y) => x + " " + y
        case Array(0, _*) => "0..."
        case _ => "something else"
      }
    
      println(f(Array(1,3)))
      println(f(Array(0,1,3)))
    1 3
    0...

    列表:

      def fl (str: Any) = str match{
        case 0::Nil => "0"
        case x::y::Nil => x + " " + y
        case 0::tail => "0..."
        case _ => "something else"
      }
    
      println(fl(List(0)))
      println(fl(List(1,3)))
      println(fl(List(0,1,3)))
    0
    1 3
    0...

    元组:

      def ft (str: Any) = str match{
        case (0,_) => "0"
        case (x,y)=> x + " " + y
        case (x,0,_) => "0..."
        case _ => "something else"
      }
    
      println(ft(Tuple2(0,1)))
      println(ft(Tuple3(1,0,2)))
      println(ft(Tuple4(1,0,2,3)))
    0
    0...
    something else

    六、提取器

    模式匹配数组,元组,列表,这些背后是提取器机制。对象中有unapply或unapplySeq方法对值进行提取。

    unapply方法用于提取固定数量的对象,unapplySeq提取的是一个序列。

    七、变量声明中的模式

    val (x,y)=(1,2)
  • 相关阅读:
    A站C值电影列表 4月27号更新
    【dmp文件还原到oralce数据库】
    批量上传图片
    Repeater嵌套
    生成json格式
    C#汉字转为Unicode编码
    Jquery+json绑定带层次下拉框(select控件)
    Asp.net绑定带层次下拉框(select控件)
    从数据库里面取值绑定到Ztree
    根据参数显示类别(三级联动,需要JSON数据)
  • 原文地址:https://www.cnblogs.com/one--way/p/8400292.html
Copyright © 2011-2022 走看看