模式匹配应用场景: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)

Scala--模式匹配和样例类的更多相关文章

  1. Scala模式匹配和样例类

    Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配     def mai ...

  2. scala模式匹配与样例类

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...

  3. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  4. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  5. 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架

    1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...

  6. 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

    一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...

  7. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  8. Scala集合库、模式匹配和样例类

    package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...

  9. Scala-Unit6-final/type关键字、样例类&样例对象

    一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...

随机推荐

  1. 显示Linux进程打开了哪些文件? 用lsof命令

    1.lsof abc.txt --> 显示开启文件 abc.txt的进程. 2.lsof -c abc  ---> 显示abc进程现在打开的文件. 3.lsof -c -p 1234 -- ...

  2. 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)

    作为一个标准的IT男,从一开始的一线开发,做到管理层,又因为喜爱开发,跳槽继续专注coding,一干就是10多年.有时候就想,这样一直学习,coding,如果能干到老也挺不错的! 不过生活的压力是不会 ...

  3. 小程序实践(六):view内部组件排版

    涉及知识点: 1.垂直排列,水平排列 2.居中对齐 示例: 1.默认排版 , 一个父组件里面两个子view 显示效果: 2.先给父view设置一个高度和颜色值,用于看效果 3.实现水平排列和垂直排列的 ...

  4. WPF控件库:文字按钮的封装

    需求:封装按钮,按钮上面只显示文字.在鼠标移上去.鼠标点击按钮.以及将按钮设为不可用时按钮的背景色和前景色需要发生变化 实现:继承Button类,封装如下6个属性: #region 依赖属性 /// ...

  5. git多个远程仓库

    1. 前言   用GitHub管理自己的开源项目有几年了,最近一年更新得比较多,仓库也越来越多越来越大.有时候感觉GitHub太慢,尤其是最近感觉更为明显,于是萌生了再找个国内类似GitHub的代码托 ...

  6. 机器学习之隐马尔科夫模型HMM(六)

    摘要 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程.其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步 ...

  7. [20190306]共享服务模式与SDU.txt

    [20190306]共享服务模式与SDU.txt --//一些文档提到共享服务模式,服务端SDU=65535,测试验证看看.--//链接:https://blogs.sap.com/2013/02/0 ...

  8. css图片垂直水平居中及放大(实现水平垂直居中的效果有哪些方法?)

    实现水平垂直居中方法有很多种: 一.万能法: 1.已知高度宽度元素的水平垂直居中,利用绝对定位和负边距实现. <style type="text/css"> .wrap ...

  9. NVIDIA显卡笔记本安装ubuntu驱动以及分辨率之详解

    随着对ubuntu的了解,突然想在自己的笔记本上装一个双系统.在网上查了安装方法之后,发现因为nvidia显卡的原因会出现一些问题,结果在我自己装了之后发现问题要比看到的多,再看了无数个帖子之后,最终 ...

  10. iOS In-App Purchase(IAP)内购服务端二次验证注意事项

    前端iOS完成对应的商品购买之后,会得到一个Transaction(交易)的数据结构指针,后端实际上只需要这个结构内的一个东西,那就是 transaction.transactionReceipt. ...