(数据科学学习手札49)Scala中的模式匹配
一、简介
Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍:
二、Scala中的模式匹配
2.1 基本格式
Scala中模式匹配的基本格式如下:
data match {
case ... => 执行语句
case ... => 执行语句
case _ => 执行语句
}
其中,data表示将要进行模式匹配的对象,match是模式匹配的关键字,后面紧跟的{}中包含若干条匹配的方向,且只会匹配其中满足条件的第一条;对于每一条条件,都是以case关键字开头,紧跟匹配的模式,且_表示匹配任何模式,接着是=>,指向对应的执行语句,下面是一个简单的示例:
- object main{
- def main(args: Array[String]): Unit = {
- var data:String = "Hadoop"
- //模式匹配语句
- data match {
- case "Spark" => println("No!")
- case "Hadoop" => println("Yes")
- }
- var demo = 1 match {
- //通配符_表示匹配任何对象
- case _ => println("Anything!")
- }
- }
- }
可以看出,在第一个模式匹配语句中,匹配到对应的"Hadoop"字符串对象之后,执行了对应的语句;在第二个模式匹配语句中,_指定了匹配任意对象,并执行了对应的输出;
2.2 结合条件语句
在我们的模式匹配语句中,可以添加条件语句,在Scala中这叫做守卫,下面是一个简单的例子:
- object main{
- def main(args: Array[String]): Unit = {
- def isMale(Gender:Int)={
- Gender match {
- case 1 => println("Yes!Male!")
- case 0 => println("No!Female!")
- //添加守卫的模式匹配语句
- case _ if Gender != 0 & Gender != 1 => println("Unknown!")
- }
- }
- //调用函数
- isMale(0)
- isMale(1)
- isMale(2)
- }
- }
2.3 结合变量
在Scala的模式匹配中,我们还可以在模式语句内直接赋以新变量,来与传入的变量结合起来,对上面的例子稍加改造得到下面这个例子:
- object main{
- def main(args: Array[String]): Unit = {
- def isMale(Gender:Int)={
- Gender match {
- case 1 => println("Yes!Male!")
- case 0 => println("No!Female!")
- //添加守卫的模式匹配语句
- case gender if gender != 0 & gender != 1 => {
- println("Unknown!")
- //在match语句中调用新变量
- println("gender = " + gender)
- }
- }
- }
- //调用函数
- isMale(2)
- }
- }
可以看出,将match语句下的模式匹配内容由常量改成新变量,会直接将传入的待匹配对象传递给该新变量,但该新变量的作用域只限于match语句内,在外无法调用;
2.4 匹配数组与元组
数组:
在对数组进行模式匹配时,可以配合通配符完成一些模糊匹配的功能:
- import scala.collection.mutable.ArrayBuffer
- object main{
- def main(args: Array[String]): Unit = {
- val Demo = ArrayBuffer("Spark","Scala","Python")
- Demo match {
- case ArrayBuffer("Scala") => println("No!")
- case ArrayBuffer("Spark",_*) => println("Yes!")
- case _ => println("Warning!")
- }
- }
- }
通过在匹配内容中添加_*,来表示匹配任意多的数组元素,这这里表示匹配第一个元素时"Spark",之后任意多其他元素的可变长数组;
元组:
在匹配元组时,同样可以使用对应的语法来实现模糊匹配:
- object main{
- def main(args: Array[String]): Unit = {
- def fitTuple(tuple:Tuple2[Any,Any]): Unit ={
- tuple match {
- case (1,"Spark") => println("1")
- //匹配第二个元素为Scala的长度为2的元组
- case (x,"Scala") => println(x)
- case _ => println("Nothing!")
- }
- }
- val t = (3,"Scala")
- fitTuple(t)
- }
- }
2.5 异常处理与模式匹配
在前面的(数据科学学习手札45)Scala基础知识中提到过Scala中的错误处理机制,其实catch{}语句中的各条执行语句就是一条条的模式匹配语句,这里便不再赘述。
以上就是Scala中关于模式匹配的一些基础内容的简单介绍,如有笔误,望指出。
(数据科学学习手札49)Scala中的模式匹配的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札36)tensorflow实现MLP
一.简介 我们在前面的数据科学学习手札34中也介绍过,作为最典型的神经网络,多层感知机(MLP)结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数,而除了利用前面介绍的sklearn.n ...
随机推荐
- Windows环境下JDK的配置及多版本JDK切换的方法记录
(这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...
- Docker扩展.md
逻辑卷 Volume 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数 ...
- java 相等测试与继承
内容中包含 base64string 图片造成字符过多,拒绝显示
- python process,queue
#-*- coding:utf-8 -*- from multiprocessing import Process,Queue import os,time,random def write(q): ...
- linux 根据端口号查看占用进程的pid
1.netstat -nap | grep 端口号 2.第一种的可以查看端口号对应的pid,但是会出现pid为空的情况,这种时候用:lsof -i:端口号 3.根据pid查看端口号 netstat - ...
- 2763. [JLOI2011]飞行路线【分层图最短路】
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化
# coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...
- Linux开启路由的方法
Linux开启路由的命令很简单,只需要一条命令即可: [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 这个只是临时修改,如果 ...
- 利用maven开发springMVC项目——开发环境搭建(版本错误解决)
申明:部分内容参见别人的博客,没有任何的商业用途,只是作为自己学习使用.(大佬博客) 一.相关环境 - eclipse :eclipse-jee-oxygen-3-win32-x86_64(下载地址) ...
- JNI由浅入深_8_JNI缓存字段和方法ID
获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...