Scala的模式匹配是通过match表达式从若干可选项中选择,类似Java中的switch。

例子:

val firstArg = if(args.length>0) args(0) else ""
firstArg match{
case "salt" => println("pepper");
case "chips" => println("salsa");
case "eggs" =>println("bacon");
case _ => println("huh?"); //缺省的样例以 _ 表示
}

如果我们要访问匹配的输入参数使用unexpected来访问

val colorNum = 4;
val colorStr = colorNum match{ //将匹配后的结果保存在colorStr中
case 1 => "red"
case 2 => "green"
case 3 => "yellow"
case unexpected => unexpected + "is Not Allowed"
   //unexpected代表colorNum=4
}

我们还可以在匹配中使用“守卫”,也就是if来添加一些必要的处理逻辑。

for(elem <- List(1,2,3,4)){
elem match{
case _ if(elem %2 ==0) => println(elem + " is even.")
case _ => println(elem+" is odd.")
}
}

注意,上例我们使用的是 case _ if 的意思是所有的elem都进来,然后进行if的判断。

其实我们常见的map遍历也是使用了模式匹配。

val map = Map("zhang" -> 1,"yu" -> 2,"hang" -> 3);
for((k,v) <- map){//遍历map
println("("+k+","+v+")");
}

我们还可以使用case类来优化用于模式匹配的类。

case class Car(brand:String,price:Int){
val myBYDCar = new Car("BYD",10000);
val myBMWCar = new Car("BWM",20000);
val myBENZCar = new Car("BENZ",30000);
for(car <- List(myBYDCar,myBMWCar,myBENZCar)){
car match {
case Car("BYD",10000) => println("BYD's price is "+car.price)
case Car("BWM",20000) => println("BMW's price is "+car.price)
case _ => println("BENZ's price is "+car.price)
}
}
}

Scala的match表达式跟JAVA的switch的区别

  1.Scala是任何常量、字符串等都可以用作样例,JAVA的case语句只支持整型、枚举和字符串常量。

  2.Scala中break是隐含的,不用直接写,JAVA需要写。

  3.Scala的match表达式会返回值,每个选项都打印出一个值。

【scala】模式匹配的更多相关文章

  1. scala模式匹配的使用

    Scala模式匹配 Tip1:模式总是从上往下匹配,如果匹配不到则匹配case_项(类似Java中的default) Tip2:与Java和C语言不同,不需要在每个分支末尾使用break语句退出(不会 ...

  2. scala模式匹配详细解析

    一.scala模式匹配(pattern matching) pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一 ...

  3. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

  4. Scala模式匹配和类型系统

    1.模式匹配比java中的switch case强大很多,除了值,类型,集合等进行匹配,最常见的Case class进行匹配,Master.scala有大量的模式匹配. Case "_&qu ...

  5. scala模式匹配与样例类

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

  6. Scala模式匹配| 隐式转换

    1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...

  7. scala 模式匹配详解 3 模式匹配的核心功能是解构

    http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻 ...

  8. scala 模式匹配详解 2 scala里是怎么实现的?

    在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...

  9. scala 模式匹配详解 1

    什么是模式? 一些刚从java转到scala的同学在开发的过程中犹如深陷沼泽,因为很多的概念或风格不确定,scala里有很多的坑,模式匹配也算一个.我整理了一下自己所理解的概念,以及一些例子.这个系列 ...

  10. Scala模式匹配常用

    今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...

随机推荐

  1. git 解决push报错:[rejected] master -> master (fetch first) error: failed to push some refs to

    今天对代码进行了修改优化,然后往往远程push,但push后报错了 git操作 git add . git commit -m"fix" git push origin maste ...

  2. Andrew Ng机器学习编程作业:Neural Network Learning

    作业文件: machine-learning-ex4 1. 神经网络 在之前的练习中,我们已经实现了神经网络的前反馈传播算法,并且使用这个算法通过作业给的参数值预测了手写体数字.这个练习中,我们将实现 ...

  3. 修改sql server实例、数据库、表、字段的排序规则

    转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.h ...

  4. Redis六(管道)

    管道 为什么使用管道? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处 ...

  5. BCH码

    http://baike.baidu.com/link?url=CfLtm9DigwWdup-9VJP99RG65NgaVOXfrnjT61ogP7au0QOrlypq72k67B0s1Ey-Q1yD ...

  6. 整合subeclipse和Tortoise SVN

      先来一个下载链接(subeclipse1.8和TortoiseSVN1.7): http://download.csdn.net/detail/cangfengluyu/8416395   对于同 ...

  7. JavaScript与Java数据类型的区别

    今天开始正式认真学习js,虽然在平常j2ee开发中也经常用到JS但并不精通,这次随笔记下js与Java数据类型的不同之处 Number 与java不同,js作为弱类型语言即使在浮点数与整数上也未作明确 ...

  8. C# 异步同步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  9. 联合体union

    1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间: //4*7==282.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除 ...

  10. JUnit4 入门笔记

    Test注解的两个可选参数 expected timeout The Test annotation supports two optional parameters. The first, expe ...