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. CNI flannel插件

    // plugins/meta/flannel/flannel.go func cmdAdd(args *skel.CmdArgs) error 调用n, err := loadFlannelNetC ...

  2. Django继承

    Django目前支持两种不同的继承方式,包括抽象基础类和多表继承. 1.抽象基础类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cla ...

  3. 001-前端系列-react系列

    一.概述 原文地址:http://www.ruanyifeng.com/blog/2016/09/react-technology-stack.html 二.摘要 ES6 语法:教程 [可以了解] B ...

  4. 002-es6字符串扩展

    1.字符串扩展 参考地址:http://es6.ruanyifeng.com/#docs/string 1.1.codePointAt() JavaScript 内部,字符以 UTF-16 的格式储存 ...

  5. C#数组的笔记

    Array.Copy的笔记: 1.将值类型的元素装箱位引用类型的元素,比如讲一个Int32[]的元素复制到Object[]中 2.将引用类型的元素拆箱为值类型的元素 3.加宽CLR基元值类型,比如讲一 ...

  6. nginx灰度环境

    1.nginx.conf split_clients "${remote_addr}AAA" $request_type { 25% "abtest"; * & ...

  7. List和Set区别

    1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...

  8. PHP 留言板练习

    登录页面同session一样 login页面 <form action="loginchuli.php" method="post"> <di ...

  9. GIT使用—一些概念

    (1)Git版本库(repository) 一个简单的数据库,包括所有用来维护与管理项目的修订版本和历史的信息. Git维护两个主要的数据结构: 对象库(object store)-在复制操作时能进行 ...

  10. Sybase:delete与truncate、drop区别

    Sybase:delete与truncate.drop区别 区别: TRUNCATE TABLE TABLENAME:删除内容.释放空间但不删除定义. DELETE FROM TABLENAME:删除 ...