基本语法

 变量 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中的模式匹配的更多相关文章

  1. 第74讲:从Spark源码的角度思考Scala中的模式匹配

    今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...

  2. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  3. 第3节 Scala中的模式匹配:1 - 5

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

  4. 从jvm来看,scala中的@究竟是个什么鬼?@模式匹配符号(scala 词法分析 语法分析常用)

    从jvm来看,scala中的@究竟是个什么鬼? 我也是初步尝试来看jvm的类文件,又是初次来分析@,如不对的地方,请各位指正! 先看一下@ 是个什么? object TestScala { def m ...

  5. Scala中的偏函数与部分应用函数

    Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部 ...

  6. scala中常用但其他语言不常见的符号含义

    本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23  新增scal ...

  7. scala中的Type使用

    trait Base { val name: String } case class S( name: String, age: Int ) extends Base case class F( na ...

  8. Programming In Scala笔记-第十六章、Scala中的List

    本章主要分析Scala中List的用法,List上可进行的操作,以及需要注意的地方. 一.List字面量 首先看几个List的示例. val fruit = List("apples&quo ...

  9. scala中option、None、some对象

    转载:http://www.jianshu.com/p/95896d06a94d 1.option类型避免对象是空值,造成空指针异常. 2.None对象表示null,在没有对象返回时使用,some在有 ...

随机推荐

  1. 使用bison和yacc制作脚本语言(4)

    我们现在开始设计数据结构: interpreter.h #ifndef INTERPRETER #define INTERPRETER #include "../include/eval.h ...

  2. ISAP学习笔记

    学完了ISAP,感觉心情舒畅,毕竟ISAP比Dinic好一点. 说到底ISAP其实是Dinic(不熟悉Dinic的人去我的博客找猴子课堂----最大流与最小割(看看思想),已经置顶)优化版,熟悉的人知 ...

  3. MySQL高级第五章——主从复制

    一.复制的基本原理 slave会从master读取binlog(二进制日志文件)进行数据同步 步骤: 详细操作步骤请参见:http://www.cnblogs.com/luckcs/articles/ ...

  4. 下载地图瓦片(包括各种格式的,Openstreetmap,googlemap, bingmap)

    参考第三方开源库Brutile 个人的程序托管在github上

  5. 北京Uber优步司机奖励政策(3月23日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. java.lang.RuntimeException: HRegionServer Aborted

    java.lang.RuntimeException: HRegionServer Aborted 当我们启动hbase集群的时候,刚启动时每个节点上的进程都显示正常,过一会其他两个节点上的HRegi ...

  7. Ruby 基础教程 1-2

    1.数组 创建 arrayname=[] arrayname=["1",12,"23"] 访问 arrayname[index] 更新 arrayname[in ...

  8. flume-kafka-storm-hdfs-hadoop-hbase

    # bigdata-demo 项目地址: https://github.com/windwant/bigdata-demo.git hadoop: hadoop hdfs操作 log输出到flume ...

  9. Python 的非正式介绍

    在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...

  10. 【转载】2015Android 面试题 01

    1.如何避免ANR? 答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应. 当出现下列情况时,Andr ...