`
bit1129
  • 浏览: 1067623 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十一】Scala核心五:case模式匹配

 
阅读更多
package spark.examples.scala.grammars.caseclasses

object CaseClass_Test00 {

  def simpleMatch(arg: Any) = arg match {
    case v: Int => "This is an Int"
    case v: (Int, String) => ("This is a (Int, String): " + v._1 + "," + v._2)
    case _ => ("Unknown type, print as is: " + _) //模糊匹配,匹配所有的情况,类似*
  }

  def caseClassMatch(arg: Any) = arg match {
    case Dog(_) => arg
    case Cat(_) => arg
    case Horse(n, a, w) => w
  }

  def constantMatch(arg: Any) = arg match {
    case 3 => "This is an Int 3"
    case "3" => "This is a string 3"
    case true => "This is boolean true"
    case Nil => "This is a Nil"
    case null => "This is null"
  }

  def partialMatch(arg: List[_]) = arg match {
    case List(0, _, _) => "This is a list of length 3, and also starts with 0"
    case List(0, _*) => "This is a list of length not 3, and starts with 0: " + arg.size
  }

  def tupleMatch(arg: Any) = arg match {
    case (k, v) => "Tuple2: " + k + "," + v
    case (k, v, w) => "Tuple3: " + k + "," + v + "," + w
  }

  def typeMatch(arg: Any) = arg match {
    case v: Int => "Int:" + v
    case m: Map[_, _] => "Map:" + m.size
    case t: (_, _) => "Tuple2: " + t._1 + "," + t._2
    case _ => "Unknown type:" + arg
  }

  def typeEraseMatch(arg: Any) = arg match {
    case m: Map[Int, Int] => "Map from Int to Int:" + m.size
    case l: List[Int] => "Int List: " + l.size
    case t: (String, String) => "String tuple" + t._1
  }

  def arrayTypeEraseMatch(arg: Any) = arg match {
    case ia: Array[Int] => "Int Array: " + ia.length
    case sa: Array[String] => "String List: " + sa.length
  }

  def precedenceMatch(arg: Any) = arg match {
    case e: IllegalArgumentException => "This is an IllegalArgumentException"
    case e: Exception => "This is an Exception."
  }

  def optionMatch(arg: Option[_]) = arg match {
    case Some(s) => s
    case None => "?"
  }


  //等同于 abstract class Animal { /*empty body*/}
  abstract class Animal

  //1. 无参的case class已经deprecated
  //2. name默认成为case class的val field
  //3. 无需new Cat("kitty")
  //4.可以copy进行构造一个全新的case class,只有部分属性不同的情况很合适
  //5. match/case匹配,match/case class匹配,=>用于分隔模式和模式匹配结果的表达式
  //6. match/case匹配,match/case class匹配,case中的属性值,可以使用变量指代或者_指代
  //7. case _ => expr,表达的是模糊匹配或者任意匹配
  //8.常量匹配
  //9. List匹配
  //10. Tuple匹配
  //11.类型匹配
  //12. 集合元素的类型运行时擦除:List,Map,Tuple,不包括数组
  //13. 数组元素类型运行时不檫除
  //14.匹配优先级,类似switch/case+break
  //15. Option
  case class Cat(name: String) extends Animal

  case class Dog(name: String) extends Animal

  case class Horse(name: String, age: Int, weight: Double)

  def main(args: Array[String]) {
    println(Cat("kitty"))
    println(Cat("kitty").name)
    println(new Dog("carl"))
    val h1 = Horse("H", 8, 121.1)
    val h2 = h1.copy(name = "X")
    println(h2)

    println(simpleMatch(100))
    println(simpleMatch(100, "200"))

    println(caseClassMatch(Dog("Carl")))
    println(caseClassMatch(Horse("H", 11, 222.2)))

    //常量匹配
    println(constantMatch(3))
    println(constantMatch(1 == 1))
    println(constantMatch("3"))
    println(constantMatch(null))
    println(constantMatch(Nil)) //Nil表示空List

    //部分匹配
    println(partialMatch(List(0, 1, 2)))
    println(partialMatch(List(0, 1, 2, 3)))

    //元组匹配
    println(tupleMatch(1, 2))
    println(tupleMatch("One", "Tow", "Three"))

    //类型匹配
    println(typeMatch(100))
    println(typeMatch(Map(1 -> 2, 2 -> 3)))
    println(typeMatch(("One", "Two")))
    println(typeMatch(("One", "Two", "Three"))) //Unknown type

    //类型的运行时擦除:List,Map,Tuple
    println(typeEraseMatch(Map(1 -> 1, 2 -> 2))) //匹配m成功
    println(typeEraseMatch(Map("One" -> "One", "Two" -> "Two"))) //匹配m成功

    println(typeEraseMatch(List(1, 2, 3))) //匹配l成功
    println(typeEraseMatch(List("One", "Two", "Three"))) //匹配l成功

    println(typeEraseMatch((1, 1))) //匹配t成功
    println(typeEraseMatch(("One", "One"))) //匹配t成功

    println(arrayTypeEraseMatch(Array(1, 2))) //匹配ia成功
    println(arrayTypeEraseMatch(Array("One", "Two"))) //匹配sa成功

    println(precedenceMatch(new IllegalArgumentException()))
    println(precedenceMatch(new NullPointerException()))

    //Option匹配
    println(optionMatch(Map("One"->"Two").get("One"))) //Two
    println(optionMatch(Map("One"->"Two").get("1"))) //?
  }

}

 

A case class is a simple type of immutable class that comes with implementations of all of the basic Java class methods, like toString, equals, and hashCode, which makes them very easy to use

分享到:
评论

相关推荐

    scala语言for循环中的模式匹配

    本文将详细介绍 Scala 语言 for 循环中的六种模式匹配方式:变量模式匹配、常量模式匹配、变量绑定模式匹配、类型模式匹配、构造函数模式匹配和序列模式匹配。 变量模式匹配 在 Scala 语言中,变量模式匹配是最...

    scala-2.12.6.tgz

    它的语法简洁,支持高阶函数、模式匹配、匿名函数、类型推断等特性,使得代码更加简洁和易于理解。 2. 版本2.12.x: Scala的版本号通常以主版本号.次版本号.修订号的形式表示。2.12.x系列是Scala的一个主要分支,...

    Scala 专题教程 - Case Class和模式匹配-内含源码以及设计说明书(可以自己运行复现).zip

    本教程将深入探讨Scala中的Case Class和模式匹配这两个关键概念,通过实例和源代码帮助你理解和掌握它们。下面是对每个知识点的详细说明。 **Case Class** 在Scala中,Case Class是一种特殊的类,它被设计用于模式...

    大数据课程-Scala编程基础-5.Scala模式匹配_lk_edit.ppt

    本课程内容涵盖多个关键概念,如模式匹配、样例类、隐式函数和异常处理及泛型,这些都是Scala语言强大特性的体现。 首先,Scala的模式匹配是一种强大的控制流构造,类似于Java中的switch语句,但更为灵活。它允许...

    Scala和设计模式.pdf

    Scala作为一种兼具面向对象和函数式编程特性的现代语言,通过一系列高级语言特性(如模式匹配、类型推断等)使得许多设计模式的实现更加简洁高效。 #### 二、Scala中的设计模式 接下来,我们将具体介绍几种在Scala...

    Scala考试题1

    - Scala 的模式匹配更强大,支持值匹配、类型匹配、提取器对象等,而 Java 的 switch-case 仅限于值比较。 14. **Scala 与 Java 的五点区别**: - Scala 支持函数式编程,Java 主要是面向对象。 - Scala 有更...

    scala pattern design 设计模式

    - **模式匹配**:Scala中的模式匹配是一种强大的工具,可以在模式匹配语句中使用各种类型的模式,如case类、元组等,这为实现某些设计模式提供了便利。 - **高阶函数**:Scala支持高阶函数,即函数作为参数传递给...

    Scala语言规范版本:2.7

    模式匹配是Scala中的一个核心概念,它允许程序员按照模式来检查数据。模式匹配包括变量模式、类型化模式、字面值模式等多种形式,并且支持模式中的类型参数推断。模式匹配表达式和模式匹配匿名函数为处理数据提供了...

    scala pattern match

    1. **案例类(Case Classes)**:这是Scala中一种特殊的类,主要用于模式匹配。它们自动实现了`equals`和`hashCode`方法,以及`toString`方法,非常适合用作模式匹配中的模式。 2. **提取器(Extractors)**:在...

    Scala-2.11.1.zip

    它可以处理复杂的数据结构,如case类和模式匹配,这在处理数据时非常有用。 2. **面向对象编程**:Scala支持传统的面向对象编程,包括类、接口、继承和多态。不过,它还引入了特质(trait),这是一种更轻量级的...

    scala 案例

    5. **模式匹配**:Scala的模式匹配允许解构复杂数据结构,如`case`语句用于匹配不同情况,常用于解析数据或实现算法。 6. **Actor模型**:Akka框架是Scala生态系统的一部分,它提供了一种基于Actor模型的并发处理...

    scala实战高清讲解

    - 枚举与case类:Scala中的枚举和case类为模式匹配提供了便利,使代码更简洁、可读性更强。 - 解构:模式匹配允许对复合类型进行解构,提取出内部元素。 7. **特质(Traits)** - 特质是Scala的多重继承机制,...

    快学Scala课后习题答案

    例如,`case (a, b) => a + b` 是一个简单的模式匹配例子。 4. **高阶函数**:函数在Scala中是第一类公民,可以作为参数传递,也可以作为返回值。这使得函数式编程成为可能。 5. **面向对象编程**:Scala支持类和...

    Scala程序设计:Java虚拟机多核编程实战1

    模式匹配结合Scala的case类,使得模式匹配不仅限于简单的数据类型,还能应用于复杂的数据结构和算法设计。 并发编程是本书的重点,Scala通过Actor模型提供了一种高效、安全的并发机制。Actor是独立运行的实体,通过...

    Scala编程实战

    9. **Case类和Case对象**:Scala中的Case类和Case对象简化了模式匹配和数据表示,常用于创建不可变的、具有元组样式的数据结构。 10. **类型类**:类型类是一种设计模式,它允许在运行时添加新的行为到已有类型上,...

    Scala(Scala)所谓的:您如何称呼它?...对于Scala(Scala)

    4. **模式匹配**:Scala的模式匹配允许程序员以声明式的方式处理数据结构。它可以用于解构复杂的数据结构,如case类和数组,简化了处理和分析数据的过程。 5. **Actor模型**:Scala集成了Akka库,提供了基于Actor...

    一些scala实例

    - **模式匹配:** Scala的模式匹配功能允许我们对值进行解构,便于处理复杂数据结构。 - **case类:** Scala的case类简化了创建不可变对象的过程,并且与模式匹配紧密配合。 - **高阶函数:** 函数可以作为参数...

    《Scala实用指南》代码清单

    7. 高级语法:如元组、模式匹配、case类和对象表达式,提供了强大的表达能力,使得编写复杂逻辑变得更加简单。 SBT作为Scala项目的主要构建工具,具有以下特点: 1. 依赖管理:SBT使用 Ivy 库来处理依赖,可以从...

    scala学习资料

    5. 特性与模式匹配:Scala支持特性(trait),这是一种轻量级的抽象类型,可以用来实现多重继承。模式匹配是Scala的一个强大特性,可以用于解构复杂的数据结构,简化条件判断和数据处理。 6. 高级语法:Scala的语法...

    Scala编程详解 第21讲-Scala编程详解:Actor入门 共8页.pptx

    `case class`还支持模式匹配,使得Actor可以轻松地处理不同类型的消息。例如,创建一个处理用户注册和登录的`UserManageActor`: ```scala case class Login(username: String, password: String) case class ...

Global site tag (gtag.js) - Google Analytics