前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >scala 模式匹配的几个模式

scala 模式匹配的几个模式

作者头像
Tim在路上
发布于 2020-08-04 15:46:29
发布于 2020-08-04 15:46:29
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

Scala 的模式匹配是类似与正则匹配的的模式匹配,但是不仅仅如此,它还可以匹配对象的内在的构建形式.

模式匹配就是反向的构造器,可以通过嵌套器来构造对象,在构造时提供一些参数

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val list = List(3,6)
list: List[Int] = List(3, 6)

scala> list match {
     |  case Nil => "was an empty list"
     |  case x :: xs => "head was " + x + " , tail was " + xs
     | }
res0: String = head was 3 , tail was List(6)

1. 常量模式

包含常量变量,常量字面量都可以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val  site = "alibaba.com"
site: String = alibaba.com

scala> site match { case "alibaba.com" => println("ok")}
ok

scala> val ALIPAY = "zhifubao"
ALIPAY: String = zhifubao
//注意这里常量必须以大写字母开头
scala> def foo(s: String) {s match {case ALIPAY => println("ok")}}
foo: (s: String)Unit

scala> 

scala> foo(ALIPAY)
ok

2. 变量模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
site match { case whateverName => println(whateverName) }

上面把要匹配的 site对象用 whateverName 变量名代替,所以它总会匹配成功。不过这里有个约定,对于变量,要求必须是以小写字母开头,否则会把它对待成一个常量变量,比如上面的whateverName 如果写成WhateverName就会去找这个WhateverName的变量,如果找到则比较相等性,找不到则出错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List(1,2) match{ case List(x,2) => println(x) }

3. 通配符模式

通配符用下划线表示:"_" ,可以理解成一个特殊的变量或占位符。 单纯的通配符模式通常在模式匹配的最后一行出现,case _ => 它可以匹配任何对象,用于处理所有其它匹配不成功的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scala> List(1,2,3) match{ case List(_,_,3) => println("ok") }

4. 构造器模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//抽象节点
trait Node 
//具体的节点实现,有两个子节点
case class TreeNode(v:String, left:Node, right:Node) extends Node 
//Tree,构造参数是根节点
case class Tree(root:TreeNode)  

// Exiting paste mode, now interpreting.

defined trait Node
defined class TreeNode
defined class Tree

scala> val tree = Tree(TreeNode("root",TreeNode("left",null,null),TreeNode("right",null,null)))
tree: Tree = Tree(TreeNode(root,TreeNode(left,null,null),TreeNode(right,null,null)))

scala> tree.root match { 
     |         case TreeNode(_, TreeNode("left",_,_), TreeNode("right",null,null)) =>
     |              println("bingo") 
     |     }

5. 类型模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"hello" match { case _:String => println("ok")}
ok

如果使用了泛型,它会被擦拭掉,如同java的做法,所以上面的 List[String] 里的String运行时并不能检测 foo(List("A")) 和 foo(List(2)) 都可以匹配成功。实际上上面的语句编译时就会给出警告,但并不出错。 通常对于泛型直接用通配符替代,上面的写为 case a : List[_] =>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scala 的模式匹配
最近开始学习 Scala,相较于学习 Haskell 的过程来看,Scala 真是直观得多,友好得多,更容易上手。以前写过关于从熟悉的 Java 和 JavaScript 来逐步学习 Groovy 和 Haskell 的文章,这以后再来学习 Scala 的话,就可以不断比较了。如果和我一样有 Java 经验的话但是从来没有接触过 Scala 的话,建议先阅读这篇文章,A Scala Tutorial for Java Programmers,一边比较,一边熟悉,同时配套的还有这个,Scala for Java programmers – Joakim Ohlrogge & Enno Runne,Youtube 上的视频,很直观,然后再从 Scala 官网的文档上面逐步涉入。
四火
2022/07/19
1K0
Scala 的模式匹配
Scala学习笔记
3、方法的声明格式 def(x:Int,y:Int) : Int ={} 最后一个冒号后面是返回类型,不加则没有返回值
用户3003813
2018/09/06
2530
Scala专题系列 (八) : 模式匹配
上面例子中,创建一个单例Demo,里面包含一个函数matchTest,并且参数类型是Any(scala中所有类的超类,表示任意类型), 注意看函数体 x = match{ case 1 => "one" } 这个就是scala中模式匹配的语法结构, 首先变量.match(选择器) 后面跟着一个花括号, 括号里面case指定的匹配项 , 而 => 右面指定的是表达式 , 在语句中 case _ 等同于java中swich语句的default ,如果匹配项都不符合要求,那么就返回一个默认值
用户5252199
2022/04/18
8830
有趣的Scala模式匹配
它被称为模式匹配,模式匹配包含了一系列以case关键字开头的分支,每一个分支包含一个模式或者是多个表达式。模式有很多种,例如常量模式('*',1),变量模式(可以匹配任何值),通配模式(又见面了,'_'符号),构造方法模式(类似于样例类的初始化)等等。 用一个例子简单说明就是:
哒呵呵
2018/08/06
1.1K0
2021年大数据常用语言Scala(三十三):scala高级用法 模式匹配
在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。
Lansonli
2021/10/11
7900
scala 语法深析
scala是一种基于JVM的编程语言,spark框架是使用scala语言编写的,要阅读源码就必须掌握scala,虽然spark可以采用java和python进行开发,但是最快速的支持方式任然是scala方式的API.
Tim在路上
2020/08/04
6640
(数据科学学习手札49)Scala中的模式匹配
  Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍:
Feffery
2018/09/07
7530
学好Spark必须要掌握的Scala技术点
Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作。
大数据学习与分享
2020/08/10
1.6K0
学好Spark必须要掌握的Scala技术点
Scala学习笔记(七)
在这里what()方法报错了,主要是因为还缺少了对Cylinder的匹配,只要改成如下的代码就可以正常运行了。
fengzhizi715
2018/08/24
8490
Scala语言快速了解一下?
Scala 是 Scalable Language 的简写,是一门多范式的编程语言。Java平台的Scala于2003年底/2004年初发布。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。Scala 源代码被编译成 Java 字节码,所以它可以运行于 JVM 之上,并可以调用现有的 Java 类库。
码之有理
2022/11/11
3.1K1
Scala语言快速了解一下?
Scala学习笔记(八)
模式匹配是 Scala 的重要特性之一,前面两篇笔记Scala学习笔记(六) Scala的偏函数和偏应用函数、Scala学习笔记(七) Sealed Class 和 Enumeration都是为了这一篇而铺垫准备的。
fengzhizi715
2018/08/24
1.1K0
scala 类型 的最详细解释
1.5 后引入了泛型,jvm 选择运行时擦除类型, 类型不可以只通过类信息进行判断. 比如: List<String>,List<Integer> 的class 都是 Class<List>,然而他们的类型是不相同的,泛型是需要通过反射来进行获得, 同时java通过增加 Type 来表达这种类型.
Tim在路上
2020/08/05
8950
scala基础学习--scala教程
翻译自《big data analytics with spark》第二章Programming in Scala scala基础 虽然scala包含了面向对象编程和函数式编程的能力,但是他更侧重函数
挖掘大数据
2018/01/09
1.3K0
Scala语言入门:初学者的基础语法指南
作为一种在Java虚拟机(JVM)上运行的静态类型编程语言,Scala结合了面向对象和函数式编程的特性,使它既有强大的表达力又具备优秀的型态控制。
BookSea
2023/10/13
3930
Scala 【 12 模式匹配 】
​ Scala 的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对 Array 和 List 的元素情况进行匹配、对 case class 进行匹配、甚至对有值或没值(Option)进行匹配。
Lokinli
2023/03/09
5940
Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)
学自 https://www.runoob.com/scala/scala-tutorial.html
Michael阿明
2021/09/06
3680
Scala 模式匹配
一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
王知无-import_bigdata
2019/03/19
8980
Scala入门与进阶(五)- 模式匹配
6.模式匹配 1.最基础的模式匹配 Java: 对一个值进行条件判断,返回针对不同的条件进行不同的处理 Scala: 变量 match { case value1 =>代码1, case value2 =>代码2, ... case _ => 代码N } object MatchApp extends App { val names = Array("zhangsan","lisi","wangwu") val name = names(Random.nextInt(names.length)) nam
Meet相识
2018/09/12
5210
Scala入门与进阶(五)- 模式匹配
Scala 高阶(九):Scala中的模式匹配
本次主要分享Scala中关于模式匹配的内容,Scala中的模式匹配类似于Java中的switch语法,但是Scala在基于Java的思想上补充了特有的功能。
百思不得小赵
2022/12/01
1.6K0
23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)
蓝桥签约作者、大数据&Python领域优质创作者。管理多个大数据技术群,帮助大学生就业和初级程序员解决工作难题。
不吃西红柿
2022/09/19
1.2K0
23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)
相关推荐
Scala 的模式匹配
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档