scala里的模式匹配和Case Class
模式匹配的简介
scala语言里的模式匹配可以看作是java语言中switch语句的改进。
模式匹配的类型
包括:常量模式、变量模式、构造器模式、序列模式、元组模式以及变量绑定模式等。
常量模式匹配
常量模式匹配,就是在模式匹配中匹配常量啦。
objectConstantPattern{
def main(args:Array[String]) :Unit = {
//模式匹配结果作为函数返回值
defpatternShow(x : Any) = x match {
case 5 => "五"
case true => "真"
case "test" => "字符串"
case null => "null值"
case Nil => "空列表"
case _ => "其他常量"
}
println(patternShow(5))
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 == 5) => x
case x if (x == "Scala") => x
case _ =>
}
println(patternShow(5))
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",27)
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"
}
println(typePattern(5.0))
println(typePattern(5))
println(typePattern("5"))
println(typePattern(List()))
}
}
变量绑定模式
在进行模式匹配时,有时不仅仅只是返回一个变量,也可以将某个变量绑定到某个模式上。
从而将整体匹配结果赋值给该变量。
具体使用方法是在模式前面加变量和@符号。
object VariableBindingPattern{
def main(args:Array[String]) :Unit = {
var t = List(List(1,2,3),List(2,3,4))
def variableBindingPattern(t : Any) = t match {{
//变量绑定,采用变量名(这里是e)
//与@符号,如果后面的模式匹配成功,则将整体匹配结果作为返回值
case List(_,e@List(_,_,_)) => e
case _ => Nil
}
println(variableBindingPattern(t))
}
}
package com.dt.spark.scala.basics
class DataFrameWork
case class ComputationFramework(name : String, popular : Boolean) extends DataFrameWork
case class StorageFramework(name : String, popular : Boolean) extends DataFrameWork
object HelloPatternMatch {
def main(args: Array[String]): Unit = {
getSalary("Hadoop MapReduce")
// getSalary("cdcdc",6)
getMatchType(100)
getMatchCollection(Array("Spark","Python"))
getBigDataType(ComputationFramework("Spark",true))
getBigDataType(ComputationFramework("Spark",false))
getBigDataType(StorageFramework("HDFS",true))
getValue("Spark",Map("Spark" -> "The hottest!" , "Hadoop " -> "The old !"))
}
//对于匹配模式来说,不需什么break,只要匹配到,就不往下了
def getSalary(name : String) {
// def getSalary(name : String,age : Int) {
name match {
case "Spark" => println("$1500/year")//表示,如果传入是Spark,则说明匹配成功,执行=>后的语句
case "Hadoop" => println("$1000/year")
case _ if name == "Scala" => println("$1800/year")//_ if name == "Scala"是守卫条件的方式,
case _ if name == "Hadoop MapReduce" => println("$800/year")
// case _name if age >= 5 => println("name : " + _name + " age : " + age + "$100/year")//getSalary("cdcdc",6)
case _ => println("$90/year")//_是前面没匹配的。即其他
//如case _ if (i%4 ==0) => println("$1800/year")这是带守卫条件的方式,对变量的值进行判断。
}
}
def getMatchType(msg : Any) {
msg match {
case i : Int => println("Integer")
case s : String => println("String")
case d : Double => println("Double")
case array : Array[Int] => println("Array")
case _ => println("Unkoen type")
}
}
def getMatchCollection(msg : Any) {
msg match {
case Array("Scala") => println("One element")
case Array("Scala","Java")=> println("Two element")
case Array("Spark", _*) => println("Many elements begins with Spark")
case _ => println("Unkoen type")
}
}
def getBigDataType(data : DataFrameWork) {
data match {
case ComputationFramework(name, popular) => println("ComputationFramework : " + "name : " + name + "popular : " + popular)
case StorageFramework(name, popular) => println("StorageFramework : " + "name : " + name + "popular : " + popular)
case _ => println("Some other type")
}
}
def getValue(key : String , content : Map[String,String]){
content.get(key) match {
case Some(value) => println(value)
case None => println("Not Found!!!")
}
}
}
scala里的模式匹配和Case Class的更多相关文章
- Scala学习文档-样本类与模式匹配(match,case,Option)
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...
- 第74讲:从Spark源码的角度思考Scala中的模式匹配
今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...
- Scala 经典的模式匹配和尾递归
Scala 经典的模式匹配和尾递归 package io import java.io.{BufferedWriter, File, FileWriter} import java.text.Simp ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- Scala基础:模式匹配和样例类
模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...
- scala中的模式匹配
基本语法 变量 match { case 值1 => 代码 case 值2 => 代码 ... case 值N if (...) => 代码 case _ => 代码 } 常量 ...
- scala 模式匹配详解 2 scala里是怎么实现的?
在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...
- scala学习手记40 - 使用case类
前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match ...
- erlang 里的if 和 case
case Expression of Pattern1 [when Guard1] -> Expr_seq1; Pattern2 [when Guard2] -> Expr_seq2; … ...
随机推荐
- Swift2.0语言教程之Swift2.0语言中的标准函数
Swift2.0语言教程之Swift2.0语言中的标准函数 Swift2.0中的标准函数 函数除了可以根据参数列表的有无分为无参函数和有参函数,还可以从定义角度分为用户自定义函数和标准函数两种.以上的 ...
- [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)
对于点集$A$,$B$,闵可夫斯基和$C=\{(x1+x2,y1+y2)|(x1,x2)\in A,(y1,y2)\in B\}$.由此可知,对于两个凸包$A$,$B$的闵可夫斯基和$C$满足,$C$ ...
- Trie树 理解
Trie树的理解 Trie树又称单词查找树,字典树,是哈希树的变种: 优点在于:最大限度地减少无谓的字符串比较,查询效率比哈希高: 缺点在于:空间消耗很大: 性质 其基本性质可以归纳为: 跟结点不包括 ...
- Educational Codeforces Round 13 C. Joty and Chocolate 水题
C. Joty and Chocolate 题目连接: http://www.codeforces.com/contest/678/problem/C Description Little Joty ...
- UVALive 4863 Balloons 贪心/费用流
There will be several test cases in the input. Each test case will begin with a line with three inte ...
- spring @Transactional注解无效
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jd ...
- IO流-批量修改文件名称案例
/* * 源文件名: 桌面-我们今天学习IO流了哈哈哈哈-001.jpg * 修改后文件名: 桌面-000x.jpg */public class File_listFiles_upda ...
- 华为S5300系列升级固件S5300SI-V200R001C00SPC300.cc
附带web,V200版本的第一个固件. 附件: 链接:https://pan.baidu.com/s/1QyXIIVho9AkhxUFYJYAkcw 密码:gaxm
- android 内部存储 安装apk
在做应用自动更新模块下载apk时遇到了内部存储和sd卡存储两种情况,存在sk卡中存储apk可以正常安装,可是在内部存储中安装apk时出现了parse error的问题. 在网上搜了搜,大致分为两种方案 ...
- 快速重启 Quick Boot plus
Quick Boot(快速启动)可方便快速地重启/关闭您的设备,或将您的设备重启到恢复/引导模式,增强版还实现了热启动和Tasker/Locale插件集成功能.快速重启汉化版 Quick Boot p ...