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

1、字符匹配

    def main(args: Array[String]): Unit = {

      val charStr = '6'

      charStr match {

        case
'+' => println("匹配上了加号")

        case
'-' => println("匹配上了减号")

        case
'*' => println("匹配上了乘号")

        case
'/' => println("匹配上了除号")

          //注意。所有的模式匹配都必须最终匹配上一个值,如果没有匹配上任何值,就会报错

       // case _  => println("都没有匹配上,我是默认值")

      }

    }

2、 匹配字符串

    def main(args: Array[String]): Unit = {

      val arr = Array("hadoop", "zookeeper", "spark")

      val name = arr(Random.nextInt(arr.length))

      name match {

        case
"hadoop"    => println("大数据分布式存储和计算框架...")

        case
"zookeeper" => println("大数据分布式协调服务框架...")

        case
"spark" => println("大数据分布式内存计算框架...")

        case _ => println("我不认识你...")

      }

 
 

}

 
 

3、守卫

模式匹配当中,我们也可以通过条件进行判断

        def main(args: Array[String]): Unit = {

         var ch = "500"

         var sign = 0

         ch match {

         case
"+" => sign = 1

         case
"-" => sign = 2

         case _ if ch.equals("500") => sign = 3

         case _ => sign = 4

         }

         println(ch + " " + sign)

        }

 
 

4、 匹配类型

 
 

def main(args: Array[String]): Unit = {

//注意泛型擦除,在模式匹配当中的类型匹配中,除了Array类型以为,所有的其他的数据类型都会被擦除掉

val a = 3

val obj = if(a == 1) 1

else if(a == 2) "2"

else if(a == 3) BigInt(3)

else if(a == 4) Map("aa" -> 1)

else if(a == 5) Map(1 -> "aa")

else if(a == 6) Array(1, 2, 3)

else if(a == 7) Array("aa", 1)

else if(a == 8) Array("aa")

val r1 = obj match {

case x: Int => x

case s: String => s.toInt

case BigInt => -1 //不能这么匹配

case _: BigInt => Int.MaxValue

case m: Map[String, Int] => "Map[String, Int]类型的Map集合"

case m: Map[_, _] => "Map集合"

case a: Array[Int] => "It's an Array[Int]"

case a: Array[String] => "It's an Array[String]"

case a: Array[_] => "It's an array of something other than Int"

case _ => 0

}

println(r1 + ", " + r1.getClass.getName)

}

 
 

5、匹配数组、元组、集合

def main(args: Array[String]): Unit = {

val arr = Array(0, 3, 5)

arr match {

case Array(0, x, y) => println(x + " " + y)

case Array(0) => println("only 0")

//匹配数组以1 开始作为第一个元素

case Array(1, _*) => println("0 ...")

case _ => println("something else")

}

 
 

val lst = List(3, -1)

lst match {

case 0 :: Nil => println("only 0")

case x :: y :: Nil => println(s"x: $x y: $y")

case 0 :: tail => println("0 ...")

case _ => println("something else")

}

 
 

val tup = (1, 3, 7)

tup match {

case (1, x, y) => println(s"1, $x , $y")

case (_, z, 5) => println(z)

case _ => println("else")

}

}

 
 

注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。

9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表

注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

6、 样例类

样例类首先是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明。样例类主要是使用在我们后面的sparkSQL当中,通过样例类来映射我们的表当中的对象

定义形式:

case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)

case object 类型,是单例的。 case object Person

    
 

 
 

case class SubmitTask(id: String, name: String)

case class HeartBeat(time: Long)

case object CheckTimeOutTask

//1、样例类当中的主构造器参数默认为val的

//2、样例类当中的apply和unapply方法自动生成

object CaseDemo04 extends App {

val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))

arr(2) match {

case SubmitTask(id, name) => {

println(s"$id,$name")

println(id)

println(name)

println(id+"\t"+name)

}

case HeartBeat(time) => {

println(time)

}

case CheckTimeOutTask => {

println("check")

}

}

}

7、偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。

                val func1: PartialFunction[String, Int] = {

                 case
"one" => 1

                 case
"two" => 2

                 // case _ => -1

                }

                
 

                def func2(num: String) : Int = num match {

                 case
"one" => 1

                 case
"two" => 2

                 case _ => -1

                }

                
 

                def main(args: Array[String]) {

                 println(func1("one"))

                 println(func2("one"))

                 //如果偏函数当中没有匹配上,那么就会报错,我们可以通过isDefinedAt来进行判断

                 // println(func1("three"))

                 println(func1.isDefinedAt("three"))

                 if(func1.isDefinedAt("three")){

                 println("hello world")

                 }else{

                 println("world hello")

                 }

                }

 
 

 
 

Scala模式匹配和样例类的更多相关文章

  1. scala模式匹配与样例类

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...

  2. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  3. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  4. 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架

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

  5. 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

    一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...

  6. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  7. Scala集合库、模式匹配和样例类

    package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...

  8. Scala-Unit6-final/type关键字、样例类&样例对象

    一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...

  9. Scala--模式匹配和样例类

    模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...

随机推荐

  1. 深入redis内部--实现双向链表

    数据结构的应用--Adlist.h定义 1.节点结构 typedef struct listNode {    struct listNode *prev;  //前向节点    struct lis ...

  2. cmd sc命令进行服务操作

    sc 命令可以注册.删除和查询系统服务 sc可供选择的参数有很多,这里不详细描述.只介绍简单的最基本的sc使用方式. 1. sc create 创建windows服务 eg: sc \\myserve ...

  3. oracle:ORA-00911: 无效字符 问题和解决---Eclipse中的SQL语句不能加分号

    eclipse中原sql: 异常: 原因:Eclipse中的SQL语句不能加分号 去掉分号,正常执行,插入成功. 这里把id设为了主键,具有唯一性,重复插入同一id执行插入失败,ORA-00001号错 ...

  4. JavaScript中有对字符串编码的三个函数:escape,encodeURI,encodeURIComponent

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  5. Button 控件

    Button 控件是由system.Windows.Forms.button类提供,该控件最常用使用就是编写处理按钮的Click事件及MouseEnter事件代码 常用属性 Text按钮的说明 Ima ...

  6. PictureBox控件

    PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...

  7. jQuery事件篇---过滤选择器 & 表单选择器

    内容提纲: 过滤选择器 1.基本过滤器 2.内容过滤器 3.可见性过滤器 4.子元素过滤器 5.其他方法 表单选择器 6.常规选择器 7.表单选择器 8.表单过滤器 发文不易,转载请注明出处! 过滤选 ...

  8. PHP-redis英文文档

    作为程序员,看英文文档是必备技能,所以尽量还是多看英文版的^^ PhpRedis The phpredis extension provides an API for communicating wi ...

  9. SQLHappy微软数据库连接查询操作,对数据的处理和查询

    (软件已更新,部分介绍与新版软件有出处) 1.服务连接界面介绍 2.主界面介绍 3.表搜索介绍 4.命令菜单部分介绍 5.插件介绍 6.帮助菜单介绍 7.数据库列表右键菜单 8.数据库结构和数据操作( ...

  10. PAT 1052. Linked List Sorting

    这场考试当年还参加了,当时直接用内置的排序了,否则自己写归并排序浪费时间啊,现在来练习一发.估计又有些节点没在链表里面,当时没考虑这个情况,所以一直有些case没过 #include <iost ...