scala 常用模式匹配类型
模式匹配的类型
包括:
- 常量模式
- 变量模式
- 构造器模式
- 序列模式
- 元组模式
- 变量绑定模式等。
常量模式匹配
常量模式匹配,就是在模式匹配中匹配常量
objectConstantPattern{
def main(args:Array[String]) :Unit = {
//模式匹配结果作为函数返回值
defpatternShow(x : Any) = x match {
case => "五"
case true => "真"
case "test" => "字符串"
case null => "null值"
case Nil => "空列表"
case _ => "其他常量"
}
println(patternShow())
println(patternShow(true))
println(patternShow(List()))
}
}
变量匹配
变量匹配,匹的是case语句后面接的是scala变量,如case x if(x == 5) => x等,在使用时一般会加守卫条件,当然也可以像case x => x这样使用,它会匹配任何输入的合法变量。
objectVariablePattern{
def main(args:Array[String]) :Unit = {
//模式匹配结果作为函数返回值
defpatternShow(x : Any) = x match {
case x if (x == ) => x
case x if (x == "Scala") => x
case _ =>
}
println(patternShow())
println(patternShow("Scala"))
}
}
构造器模式
构造器模式指的是,直接在case语句后面接类构造器,匹配的内容放置在构造器参数中。
//将Person类定义为case class
case class Person(name : String,age : Int) object ConstructorPattern{
def main(args:Array[String]) :Unit = {
val p = new Person("nyz",)
def constructorPattern(p : Person) = p match {
//构造器模式必须将Person类定义为case class,否则需要自己定义伴生对象并实现unapply方法。
case Person(name,age) => "name =" + name + ",age =" + age
//case Person(_,age) => "age =" + age
case _ => "Other"
}
println(constructorPattern(p))
}
}
序列化模式
序列模式用于匹配如数组Array、列表List、Range这样的线性结构集合,其实原理也是通过case class起作用的。
object SequencePattern{
def main(args:Array[String]) :Unit = {
val list = List("spark","Hive","SparkSQL")
val arr = Array("SparkR","Spark Streaming","Spark MLib")
def sequencePattern(p : Any) = p match {{
//序列模式匹配,_*表示匹配剩余内容,first、second匹配数组p中的第一、二个元素
case Array(first,second,_*) => first + "," + second
//_匹配数组p的第一个元素,但不赋给任何变量
case List(_,second,_*) => second
case _ => "Other"
}
println(SequencePattern(list))
println(SequencePattern(arr))
}
}
元组模式
元组模式用于匹配scala中的元组内容,用于匹配元组类型的变量内容
object TuplePattern{
def main(args:Array[String]) :Unit = {
val list = List("spark","Hive","SparkSQL")
def tuplePattern(t : Any) = t match {{
case (one,_,_) => one
//_*不适合用于元组,只适用于序列
//case (one,_*) => one
case _ => "Other"
}
println(tuplePattern(t))
}
}
类型模式
它可以匹配输入待匹配变量的类型
object TypePattern{
def main(args:Array[String]) :Unit = {
def typePattern(t : Any) = t match {
case t : String => "String"
case t : Int => "Intger"
case t : Double => "Double"
case _ => "Other Type"
}
}
变量绑定模式
在进行模式匹配时,有时不仅仅只是返回一个变量,也可以将某个变量绑定到某个模式上。从而将整体匹配结果赋值给该变量。
具体使用方法是在模式前面加变量和@符号。
object VariableBindingPattern{
def main(args:Array[String]) :Unit = {
var t = List(List(,,),List(,,))
def variableBindingPattern(t : Any) = t match {{
//变量绑定,采用变量名(这里是e)
//与@符号,如果后面的模式匹配成功,则将整体匹配结果作为返回值
case List(_,e@List(_,_,_)) => e
case _ => Nil
}
println(variableBindingPattern(t))
}
}
scala 常用模式匹配类型的更多相关文章
- Scala 常用语法
Clojure首先是FP, 但是由于基于JVM, 所以不得已需要做出一些妥协, 包含一些OO的编程方式 Scala首先是OO, Java语法过于冗余, 一种比较平庸的语言, Scala首先做的是简化, ...
- Scala之模式匹配(Patterns Matching)
前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...
- Scala的存在类型
Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法.可以在你不知道具体类型的情况下,就断言该类型存在. 存在类型用_来表示,你可以把它看成java中的?. 下 ...
- SQL常用字段类型
中文常用字段类型 1. 名称类 nvarchar(10) 2. 数量 int 3. 时间 date 4. 货币 money 5. 编号 ...
- 第54讲:Scala中复合类型实战详解
今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...
- 第53讲:Scala中结构类型实战详解
今天学习了scala的结构类型,让我们看看代码 class Structural {def open() = print("A class interface opened") } ...
- Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- C++中string转化为常用数值类型
//模板类 用于将string类型转化为 常用数值类型 template <class Type> Type stringToNum(const string& str) { is ...
随机推荐
- unittest框架学习笔记二之discover
coding=utf-8'''Created on 2018/3/29 author:star Project:discover测试用例''' import unittest,time,oslist= ...
- 23. Jmeter使用ServerAgent对服务器进行性能监控
我们在做服务器性能测试的时候,往往会考虑四个点:CPU.网络.磁盘.内存.一般情况下是使用Linux命令进行监控,那么jmeter可否做到呢?答案是可以的,闲话不多说,进入正题. 环境准备 jmete ...
- Lilo的实现
书承上文:http://www.cnblogs.com/long123king/p/3549267.html 我们找一份Lilo的源码来看一下 http://freecode.com/projects ...
- PAT_A1095#Cars on Campus
Source: PAT A1095 Cars on Campus (30 分) Description: Zhejiang University has 8 campuses and a lot of ...
- SpringBoot Controller 中使用多个@RequestBody的正确姿势
最近遇到Controller中需要多个@RequestBody的情况,但是发现并不支持这种写法, 这样导致 1.单个字符串等包装类型都要写一个对象才可以用@RequestBody接收: 2.多个对象需 ...
- 如何解决 react-create-app 里面的 no-unused-vars ?
如果每次启动都有一大串的no-unused-vars 是不是感觉特别烦,不用担心啦,有个配置可以解决它: 在Hbuild 里面可以新建一个 .eslintrc 其他文件(伤心的是我在webStorm ...
- CentOS7.6下安装Oracle JDK
注:本教程使用XShell ssh到CentOS服务器,并使用root用户登录,如使用其他普通用户登录,请在命令前加sudo 1).在/usr/local/目录下(看个人情况)新建文件夹java用来存 ...
- eclipse创建MAVEN项目是出现Could not resolve archetype的解决办法
eclipse第一次创建MAVEN项目时出现这个问题,查了很多文档改了没用,后来问了别人知道是maven中央仓库下载插件包失败就会报错. 解决办法: 用国内阿里云镜像会好很多 在settings.xm ...
- exports和module.exports的区别——学习笔记
一开始,exports和module.exports都指向空对象(同一内存块),exports是引用 module.exports的值.module.exports 被改变的时候,exports不会被 ...
- SpringBoot中使用Scheduling执行定时任务
SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多 以下任务都是在单线程下执行的 第一步 创建SpringBoot项目 第二步 外汇 ...