首页 > 其他 > 详细

《快学Scala》第十四章——模式匹配和样例类

时间:2019-12-02 20:32:36      阅读:77      评论:0      收藏:0      [点我收藏+]

一.本章要点

  • match表达式是更好的switch,不会有意外调入下一个分支
  • 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免
  • 模式可以包含一个随意定义的条件,称做守卫
  • 你可以对表达式的类型进行匹配;优先选择模式匹配而不是isInstanceOf/asInstanceOf
  • 你可以匹配数组,元祖,样例类的模式,然后匹配到不同部分绑定到变量
  • 在for表达式中,不能呢匹配的情况会被安静的跳过
  • 样例类是编译器会为之自动

二.更好的switch

  

var sign=...
val ch:Char=...
ch match{
case ‘+‘=>sign=1
case ‘-‘=>sign=-1
case _=>sign=0
}
//简写
sign=ch match{
....
}

 

三.守卫

  添加守卫做筛选条件,例:

ch match{
case ‘+‘=>sign=1
case ‘-‘=>sign=-1
//筛选所有数字
case _ if Charavter.isDigit(ch)=>digit=Character.digit(ch,10)
case _=>sign=0
}

 

四.模式中的变量

  如果case关键字后面跟着一个变量名,那么匹配的表达式会被赋值给那个变量。例如:

str(i) match{
case ‘+‘=>sign=1
...
case ch=>Character.digt(ch,10)
}

五.类型模式

  对表达式的类型进行匹配,例:

obj match{
case x:Int=>x
case s:String=>Integer.parseInt(s)
case _:BigInt=>Int.MaxValue
case _=>‘0‘
}

 

  注:在Scala中,更倾向与使用这样的匹配模式,而不是isInstanceOf操作符;

    匹配时,必须给出一个变量名,否则会拿对象本身匹配;

    匹配发生在运行期,Java虚拟机的泛型是擦掉的,因此不能用类型匹配特定的Map类型  

六.匹配数组、列表和元祖

  匹配数组:

arr match{
//通过这种绑定让你轻松的访问复杂结构各部份名:”析构“
//匹配包含0的数组 case Array(0)=>"0" //匹配任何带有两个元素的数组,并将这两个元素分别绑定在x和y case Array(x,y)=>x+" "+y //匹配任何以0开始的数组 case Array(0,_*)=>"0..." case _=>"someting else" }

  使用List表达式或者::匹配列表:

lst match{
case 0::Nil=>"0"
case x::y::Nil=>x+" "+y
case 0::tail=>"0..."
case _=>"something else"
}

 

  匹配元组:

pair match{
case (0,)=>"0..."
case (y,0)=>y+"0"
case _=>"neither is 0"
}

 

七.提取器

  前面的匹配数组,列表,元组功能背后的机制:提取器机制——带有对象中提取值的unapply或unapplySeq方法的对象。unapply方法提取固定数量的对象,unapplySeq提取一个序列。

  如:

arr match{
case Array(0,x)=>...
}

  Array伴生对象就是一个提取器——定义了一个unapplySeq方法,调用时是以被执行匹配动作的表达式作为参数,而不是模式上中看上去像是参数的表达式。unapplySeq(arr)产出一个序列的值,即数组的值。

  正则表达式是另一个适合用提取器的场景,注意这时的提取器不是伴生对象,而是正则表达式对象,例:正则表达式有分组时,匹配正则表达式分组

val pattern="([0-9]+) (a-z+)".r
"99 bottles" match{
case pattern(num,item)=>...
//num为99,item为bottles
}    

八.变量声明中的模式

  

九.for表达式中的模式

十.样例类

十一.copy方法和带名参数

十二.case语句中的中置表示法

十三.匹配嵌套结构

十四.样例类是邪恶的吗

十五.密封类

十六.模拟枚举

十七.Option类型

十八.偏函数

十九.练习

 

《快学Scala》第十四章——模式匹配和样例类

原文:https://www.cnblogs.com/lyq-biu/p/11972714.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!