Scala笔记整理(七):模式匹配和样例类

  (TOC)

  <人力资源/>   

可以用到开关语句

  

1, Scala强大的模式匹配机制,可以应用在开关语句,类型检查以及“析构”等场合。

  
 <代码> def swithOps:单元={
  var=0标志
  val ch: Char=' + '
  ch匹配{
  ' + '=比;标志=1
  ','=比;标志=1
  _=比;符号=0
  }
  println(“标志===比;“+签名)
  } 
  

上面代码中,案例_模式对应于开关语句中的违约,能够捕获剩余的情况。如果没有模式能匹配,会抛出MatchError。而且不像常见的开关语句,在一种模式匹配之后,需要使用分手来声明分支不会进入下一个分支,在scala中并不需要这种打破语句。

  

2,匹配是表达式,不是语句,所以是有返回值的,故可将代码简化:

  
 <代码>=ch匹配{迹象
  ' + '=比;1
  ','=比;1
  _=比;0
  }
  println(“标志=====比;代码”+签名) 
  

可以查看下面的完整测试案例:

  cn.xpleaf.bigdata.p5.cm
 <代码>包/* *
  * scala中的模式匹配
  *错误:找不到或无法加载主类cn.xpleaf.bigdata.p5. .CaseOps“案例”
  *
  *这里的问题出在将关键字作为类名中的一部分
  *所以今后的书写过程中尽量不要将关键字作为类名或者包名
  */对象CaseOps {
  def主要(args:数组[String]):单位={
  caseOps2
  }/* *
  * scala中的任何表达式都是有返回值的,模式匹配也不例外,我们可以直接获取对应的返回值进行操作
  *如果不写情况_的操作,匹配不上的话,会抛出相关异常:scala.MatchError
  */def caseOps2:单位={
  val ch=' 1 '
  val标志={ch匹配
  ' + '=比;1
  ','=比;0//case _=比;2
  }
  println(签名)
  }/* *
  *一般情况下也就是将模式匹配当java中做的切换实例来进行使用
  */def caseOps1:单位={
  val ch=' 1 '
  var标志=1
  ch匹配{
  ' + '=比;标志=1
  ','=比;符号=0
  _=比;符号=2
  }
  println(签名)
  }
  } 
  

输出结果如下:

  
 <代码> 2  
  

守卫

  

与如果表达式的守卫相同作用,测试案例如下:

  
 <代码>对象CaseOps {
  def主要(args:数组[String]):单位={
  caseOps3
  }/* *
  *匹配模式匹配当做守卫进行使用
  */def caseOps3:单位={
  val ch: Char=' a '
  var标志=1
  ch匹配{
  ' + '=比;标志=1
  ','=比;标志=1
  _如果Character.isDigit (ch)=比;符号=2
  _如果Character.isAlphabetic (ch)=比;符号=3
  _=比;符号=2
  }
  println("标志=" +签名)
  }
  } 
  

输出结果如下:

  
 <代码>标志=3  
  

模式中的变量

  

如果在案件关键字后跟着一个变量名,那么匹配的表达式会被赋值给那个变量。<代码> _ 是案例这个特性的一个特殊情况,变量名是<代码> _

  

测试案例如下:

  
 <代码>对象CaseOps {
  def主要(args:数组[String]):单位={
  caseOps4
  }/* *
  *将要进行匹配的值,赋值给案件后面的变量,我们可以对变量进行各种操作
  */def caseOps4:单位={
  “你好,wordl”foreach (c=比;println (
  c{匹配
  ' '=比;“空间”
  ch=比;”字符:“+ ch
  }
  ))
  }
  } 
  

输出结果如下:

  
 <代码>字符:H
  字符:e
  字符:l
  字符:l
  字符:阿
  字符:
  空间
  字符:w
  字符:阿
  字符:r
  字符:d
  字符:l  
  

类型模式

  

相比使用isInstanceOf来判断类型,使用模式匹配更好。

  
 <代码>对象CaseOps {
  def主要(args:数组[String]):单位={
  caseOps5
  }/* *
  *使用模式匹配可以代替isInstanceOf和asInstanceOf来进行使用
  */def caseOps5:单位={
  def typeOps (x:任何):Int={
  val {=x比赛结果
  我:Int=比;我
  案例:字符串=比;Integer.parseInt (s)
  z: scala.math。长整型数字=比;Int.MaxValue
  案例c: Char=比;c.toInt
  _=比;0
  }
  结果
  }
  
  println (typeOps (" 12345 ")==12345)
  
  }
  } 
  

输出结果如下:

  
 <代码>对 
  

匹配数组,列表和元组

  

测试代码如下:

  
 <代码>对象CaseOps {
  def主要(args:数组[String]):单位={
  caseOps6
  }/* *
  scala数*匹配组
  */def caseOps6:单位={
  val arr=阵列(0,1)
  {arr匹配//匹配只有一个元素的数组,且元素就是0
  数组(0)=比;println (“0”)//匹配任何带有两个元素的数组,并将元素绑定到x和y
  情况下阵列(x, y)=比;println (x + " " + y)//匹配任何以0开始的数组
  情况下阵列(0,_ *)=比;println (“0…”)
  _=比;println(“其他东西”)
  }
  }
  }

Scala笔记整理(七):模式匹配和样例类