scala中的模式匹配
基本语法
变量 match {
case 值1 => 代码
case 值2 => 代码
...
case 值N if (...) => 代码
case _ => 代码
}
常量匹配
scala> def matchConstant(x:Any) = x match {
| case 1 => "One"
| case "two" => "Two"
| case "3" => "Three"
| case true => "True"
| case null => "null value"
| case Nil => "empty list"
| case _ => "other value"
| }
特别需要注意的是,Nil是一个空的List,定义为List[Nothing]。
变量匹配
scala> def matchVariable(x:Any) = x match {
| case x if(x==1) => x
| case x if(x=="Tony") => x
| case x:String => "other value:" + x
| case _ => "unexpected value:"+x
| }
类型匹配
scala> def matchType(x:Any) = x match {
| case s:String => "the string length is:"+s.length
| case m:Map[_,_] => "the map size is:"+m.size
| case _:Int | _:Double => "the number is:"+x
| case _ => "unexpected value:"+x
| }
case class匹配
class DataFrameWork
case class ComputationFramework(name: String, pupular:Boolean) extends DataFrameWork
case class StorageFramework(name:String, popular:Boolean) extends DataFrameWork def getBigDataType(data: DataFrameWork){
data match {
case ComputationFramework(name, popular) => println("[ComputationFramework]name: " + name + " and popular: " + popular)
case StorageFramework(name, popular) => println("[StorageFramework]name: " + name + " and popular: " + popular)
case _ => println("Other situation")
}
}
option匹配
Scala有一种特殊的类型Option,Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了。
def getValue(key:String, content:Map[String, String]){
content.get(key) match {
case Some(value) => println(value)
case None => println("NOT FIND")
}
}
数组匹配
def getMatchCollection(msg : Array[String]) {
msg match {
case Array("Scala") => println("One Element")
case Array("Scala", "Java") => println("Two Element")
case Array("Spark", _*) => println("Some Element begin with Spark")
case _ => println("Unknown type")
}
}
元组匹配
def tupleMatch(t : Tuple2[String, String]) : String = t match {
case ("A", _) => "匹配以A开始的二元组"
case (_, "A") => "匹配以A结束的二元组"
case _ => "其他情况"
}
List匹配
def listMatch(list : List[String]) = list match {
case head :: Nil => "匹配只有一个元素的情况"
case x :: y :: Nil => "匹配只有两个元素的情况"
case "丽丽" :: tail => "匹配以丽丽开始的情况"
case head :: tail => "匹配多个元素的情况"
case _ => "其他情况"
}
list分为head和tail两个部分,head是list的第一个元素,tail是list中除了head外的其余元素组成的list。用::连接list时,尾节点要声明成Nil。
变量绑定
可以将匹配的对象绑定到变量上。首先写一个变量名,然后写一个@符号,最后写入该匹配的对象。如果匹配成功,则将变量设置为匹配的对象。
scala> case class Person(name: String, age: Int)
defined class Person scala> val person = Person("Tony",18)
person: Person = Person(Tony,18) scala> person match {
| case p @Person(_,age) => println(s"${p.name},age is $age")
| case _ => println("Not a person")
| }
Tony,age is 18
参考:
https://www.jianshu.com/p/d07e0bcfea3a
https://www.jianshu.com/p/1456f065a4bb
scala中的模式匹配的更多相关文章
- 第74讲:从Spark源码的角度思考Scala中的模式匹配
今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- 第3节 Scala中的模式匹配:1 - 5
7. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 7.1 ...
- 从jvm来看,scala中的@究竟是个什么鬼?@模式匹配符号(scala 词法分析 语法分析常用)
从jvm来看,scala中的@究竟是个什么鬼? 我也是初步尝试来看jvm的类文件,又是初次来分析@,如不对的地方,请各位指正! 先看一下@ 是个什么? object TestScala { def m ...
- Scala中的偏函数与部分应用函数
Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部 ...
- scala中常用但其他语言不常见的符号含义
本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23 新增scal ...
- scala中的Type使用
trait Base { val name: String } case class S( name: String, age: Int ) extends Base case class F( na ...
- Programming In Scala笔记-第十六章、Scala中的List
本章主要分析Scala中List的用法,List上可进行的操作,以及需要注意的地方. 一.List字面量 首先看几个List的示例. val fruit = List("apples&quo ...
- scala中option、None、some对象
转载:http://www.jianshu.com/p/95896d06a94d 1.option类型避免对象是空值,造成空指针异常. 2.None对象表示null,在没有对象返回时使用,some在有 ...
随机推荐
- ruby中的respond to ?用法
今天写脚本,遇到了这个函数,遂搜索及阅读相关代码,整理如下: respond_to 是判断是否是某个类型的方法,比如: ar = "ss" p ar.respond_to?(:to ...
- linux进程篇 (二) 进程的基本控制
2. 进程的基本操作 接口函数 #include <unistd.h> //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...
- 成都Uber优步司机奖励政策(3月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 【NIS】深入了解NIS
1 简介 NIS( NetworkInformation Service)提供了一个网络黄页的功能,当用户登录系统时,Linux系统会到NIS主机上去寻找用户使用的帐号密码信息加以比对,以提供用户登 ...
- docker 在window 10 专业版的安装 && .net core 在docker的部署
1.如果无法安装Hyper-V,八成是自己的杀毒软件给关了,我的是 电脑管家-启动项里面 给关掉了. 2.如果部署.net core 后 运行 报 An assembly specified in t ...
- CLR via c#读书笔记九:接口
1.接口对一组方法签名进行了统一命名.接口还能定义事件.无参属性和有参属性(C#的索引器). 2.c#禁止接口定义任何一种静态成员. 3.C#编译器要求将实现接口的方法标记为public.CLR要求将 ...
- Redis系列一 Redis安装
Redis系列一 Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...
- Java并发编程系列一:Future和CompletableFuture解析与使用
一.Future模式 Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. Future接口可以构建异步应用,是多线程开发中常见的设计模式. 当 ...
- Siki_Unity_2-10_数据结构与算法
Unity 2-10 数据结构与算法 任务1-1:数据结构简介 数据结构:数据存储的结构,数据之间的关系 数据结构分类: 集合:同属于一个集合 线性结构:数据元素存在一对一的关系 树形结构:数据元素存 ...
- HTML 之 表单
关于HTML的表单 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...