样本类和模式匹配

一:样本类就是使用case关键字声明的类,和普通类的用法都一致。

package 样本类和模式匹配

/**
  * @Author:Alex_lei
  * @Description:
  */
object Case_class {

  /**
    * people就是样本类
    * @param name 名字属性
    * @param age 年龄属性
    */
  case class people(name:String,age:Int)
  def main(args: Array[String]): Unit = {
    val p1 = people("alex",23)
    val p2 = people("Lily",22)

    println(p1)

  }
}

二:模式匹配

  模式分为:通配符,常量模式,变量模式,构造器模式,序列模式,元组模式,类型模式。

  代码示例:

  

package 样本类和模式匹配

import math.{E, Pi}
/**
  * @Author:Alex_lei
  * @Description: 几种模式的种类
  */
object Mode {
  case class people(name:String,age:Int)
  def main(args: Array[String]): Unit = {
    /**
      * 测试通配符
      */
    catch_all(3)
    println(describe(5))

    /**
      * 3.变量模式,在此例子中,pi是变量模式,所以它可以匹配任意值,所以后续的值不会匹配。
      */

    val pi = Pi
    val res = E match {
      case pi => "pi"
      case _ => "OK"
    }
    println(res)

    /**
      * 测试构造器模式
      */
    val p = people("alex",22)
    Constructor_mode(p)

    /**
      * 5.序列模式,匹配如List或Array这样的类型
      */
    val l = List(1,2,3)
    l match {
      case List(_,_,_) => println("list")
      case _ => println("something else")
    }

    /**
      * 6.元组模式
      */

    val t = (1,"alex",22)
    t match {
      case (_,_,_) => println("tuple")
      case _ => println("something else")
    }

    /**
      * 测试类型模式
      */
    val s = "alex"
    type_mode(s)
    val m = Map(1->‘2‘,2->‘3‘)
    type_mode(m)

    val m1 = Map("alex" -> "name","Lily" -> "name1")
    println(show(m1 get "alex"))
  }

  /**
    * 1.通配符,符号:_ 可以匹配任何对象
    */
  def catch_all(a:Int): Unit = {
    a match {
      case 1 => println(‘a‘)
      case 2 => println(‘c‘)
      case _ => println(‘_‘)
    }

  }

  /**
    * 2.常量模式:用常量去匹配,基本类型的常量和val或单例对象也可以被用作常量。
    * @param x
    */
  def describe(x:Any) ={
    x match {
      case 5 => "five"
      case true => "truth"
      case "hello" => "hi"
      case Nil => "the empty list"
      case _=> "something else"
    }
  }

  /**
    * 4.构造器模式
    * @param p
    */
  def Constructor_mode(p:people) = {
    p match {
      case people(_,_) => println("people")
      case _ => println("any")
    }
  }

  /**
    * 7.类型模式
    * @param x
    */
  def type_mode(x:Any) = {
    x match {
      case s: String => println(s.length)
      case m: Map[_,_] => println(m.size)
      case _ => println("something else")
    }
  }

  def show(x:Option[String]) = x match {
    case Some(s) => s
    case None => "?"
  }

}

三:模式守卫

  作用:主要是为了更精确的匹配模式,主要就是在匹配的时候加一些过滤条件。

  代码示例:

  

package 样本类和模式匹配

/**
  * @Author:Alex_lei
  * @Description: 模式守卫,主要是为了更精确的匹配模式
  */
object Mode_guard {
  def main(args: Array[String]): Unit = {
    /**
      * 测试模式守卫
      */

    val a = -10
    print("a = -10 :")
    m(a)

    val b = 10
    print("b = 10 :")
    m(b)

    val s = "abc"
    print("s = abc :")
    m(s)

    val t = "a"
    print("t = a :")
    m(t)
  }

  def m(x:Any) = x match {
    case x:Int if x>0 => println("Int")
    case x:String if x.length>2 => println("String")
    case _ => println("Any")
  }
}

四:Option类型

  option类型的值只有两种形式,可以是Some(x),其中x是实际值,也可以None对象,Some和None都是它的子类,都是使用final修饰,不能再有派生子类。

  代码示例:

package 样本类和模式匹配

/**
  * @Author:Alex_lei
  * @Description: option类型的值只有两种形式,可以是Some(x),其中x是实际值,也可以None对象
  *               Some和None都是它的子类,都是使用final修饰,不能再有派生子类
  */
object Option {
  def main(args: Array[String]): Unit = {
    val book = Map("Hadoop" -> 10,"Spark" -> 20,"Flink" -> 30,"Scala" -> 40)

    val t = book.get("Hadoop") //Option[Int] = Some(10)返回值是Option[Int]类型
    println(t)

    /**
      * 下面两个例子说明,当有返回值的时候,结果不会返回getOrElse的参数
      * 当没有返回值的时候,结果就会返回getOrElse的参数
      */
    val t1 = book.get("Hbase").getOrElse("No key") //No key
    println(t1)

    val t2 = book.get("Spark").getOrElse("yes") //20
    println(t2)
  }
}

五:封闭类

  封闭类,使用sealed关键字,用于模式匹配,当我们用样本类来做模式匹配时,想让编译器帮助我们确保列出了所有的可能,我们需要将样本类的超类进行封闭但是在进行模式匹配的时候,必须要在匹配的表达式后面加一个@unchecked注解,功能是对于随后的模式的穷举性检查将被抑制掉。否在会出现警告。

  代码示例:

  

package 样本类和模式匹配

/**
  * @Author:Alex_lei
  * @Description: 封闭类,使用sealed关键字,用于模式匹配,当我们用
  *              样本类来做模式匹配时,想让编译器帮助我们确保列出了所有
  *              的可能,我们需要将样本类的超类进行封闭。
  */
object Sealed {
  def main(args: Array[String]): Unit = {

    val t = Number(2)
    val res = describe(t)
    println(res)
    des(t)
    desc(t)

  }

  /**
    * Warning:(16, 33) match may not be exhaustive.
    * It would fail on the following inputs: Binop(_, _, _), Unop(_, _)
    * def describe(x:Expr):String = x match {
    *
    * 这样写,会出现警告,说还有两种可能性
    *
    * 解决方式可以有以下两种,分别为des函数和desc函数
    * des函数主要是在加一个通配符
    * desc函数是在要匹配的表达式后面加一个@unchecked注解,功能是对于随后的模式的穷举性检查将被抑制掉
    */
  def describe(x:Expr):String = x match {
    case Number(_) => "a number"
    case Var(_) => "a string"
  }

  def des(x:Expr):String = x match {
    case Number(_) => "a number"
    case Var(_) => "a string"
    case _ => throw new RuntimeException
  }

  def desc(x:Expr):String = (x: @unchecked) match {
    case Number(_) => "a number"
    case Var(_) => "a string"
  }
}

/**
  * 定义封闭类Expr
  */
sealed abstract class Expr

/**
  * 定义四个样本类继承Expr
  *
  */
case class Var(name:String) extends Expr
case class Number(num:Double) extends Expr
case class Unop(operator:String,args:Expr) extends Expr
case class Binop(operator:String,left:Expr,right: Expr) extends Expr

原文地址:https://www.cnblogs.com/lyr999736/p/11373274.html

时间: 2024-11-08 04:49:31

样本类和模式匹配的相关文章

Spark样本类与模式匹配

一.前言 样本类(case class)与模式匹配(pattern matching)是Scala中一个比较复杂的概念,往往让人感觉深陷泥沼.我在这里对Scala中的样本类与模式匹配进行了一些整理,希望让大家有些收获. 要学习样本类与模式匹配,先要理解这两个基本概念 .样本类是Scala提出的新概念,简单可以理解成希望用来做模式匹配的类加上case关键词就是样本类.模式匹配可以拆开来理解.这里模式不同于设计模式的模式,而是数据结构上的模式.这里的模式(pattern)是一个只包含变量. 有点类似

scala学习笔记(四)样本类与模式匹配

访问修饰符 格式:private[x]或protected[x],x指某个所属包.类或单例对象,表示被修饰的类(或方法.单例对象),在X域中公开,在x域范围内都可以访问: private[包名]:在该包名作用域内,被修饰域都能被访问: private[类名]:在该类的作用域,被修饰域都能被访问: private[this]:仅能在包含了定义的同一对象中访问,用于保证同一类中不能被其它对象访问: 例子: package tests{     private[tests] class Test{  

Scala学习文档-样本类与模式匹配

样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表达式 //样本类自动添加与类名一致的工厂方法 abstract class Expr case class Var(name:String) extends Expr//括号内参数不用加val,默认为加val的字段 case class Number(num:Double) extends Expr

【Scala】模式匹配和样本类

模式匹配 要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式是数据结构上的,这个模式用于描述一个结构的组成. 我们很容易联想到"正则表达"里的模式,不错,这个pattern和正则里的pattern相似,不过适用范围更广,可以针对各种类型的数据结构,不像正则表达只是针对字符串.比如正则表达式里 "^A.*" 这个pattern 表示以A开头.后续一个或多个字符组成的字符串:List("A&

scala模式匹配及样本类

样本类 1.带有case关键字的类被称为样本类: 例如:abstract class Expr case class Var(name: String) extends Expr case class Number(num: Double) extends Expr case class UnOp(operator:String,arg: Expr) extends Expr case class BinOp(operatot: String,left:Expr,right:Expr) exte

【转】Scala基础知识

原文地址.续 课程内容: 关于这节课 表达式 值 函数 类 继承 特质 类型 apply方法 单例对象 函数即对象 包 模式匹配 样本类 try-catch-finally 关于这节课 最初的几个星期将涵盖基本语法和概念,然后我们将通过更多的练习展开这些内容. 有一些例子是以解释器交互的形式给出的,另一些则是以源文件的形式给出的. 安装一个解释器,可以使探索问题空间变得更容易. 为什么选择 Scala? ·表达能力     ·函数是一等公民     ·闭包 ·简洁     ·类型推断     ·

scala 基础语法

文章内容全部来自:http://twitter.github.io/scala_school/zh_cn/index.html 表达式 scala> 1 + 1 res0: Int = 2 值 你可以给一个表达式的结果起个名字赋成一个不变量(val). scala> val two = 1 + 1 two: Int = 2 变量 如果你需要修改这个名称和结果的绑定,可以选择使用var. scala> var name = "steve" name: java.lang

Scala学习(二)——高级特性

apply() 方法 apply方法是Scala提供的一个语法糖 类名+括号,调用对象的apply方法 对象名+括号,调用类的apply方法 对apply方法的简单测试:(其中,带 new -- class ApplyTest,不带 new -- object ApplyTest) class ApplyTest { println("class ApplyTest") def apply() { println("class APPLY method") } }

scala模式匹配与样例类

样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x")来构造Var对象.    2.样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护. 3.编译器为这个类添加了方法toString,hashCode和equals等方法. 模式匹配: match对应Java里的switch,但是写在选择器表达式之后.即: 选择器 match {备选项}. 一个