`
功夫小当家
  • 浏览: 186395 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

scala笔记-模式匹配

阅读更多

 

1.scala是匹配和java中的switch的区别:                                                                                                   

  • switch只能匹配值,模式匹配支持的更多,可以是任何类型(ListMapArray,类型等都支持)
  • 如果没有case匹配上会抛出异常,swicth会直接退出
  • case _ defalut 都是匹配其他默认case
  • 模式匹配中每个case结束不需要显示break,不会像swicth那样,会进入下一个分支
  • match是表达式,可以赋值给变量,switch是语句,不能赋值给变量
  • case语句支持守卫(任何boolean条件)
  • case关键字后面可以跟着变量(此时匹配的表达式会复制给这个变量)

 

2.case 后可以跟着变量,也可以是常量

  • 常量:大写字母开头或者 `小写字母开头`
  • 变量:小写字母开头

 

3.case匹配类型,jvm类型擦除机制

  • Array类型保存完整,可以匹配特定的ArrayT
  • ListMapSet,会被擦除类型,不能匹配特定类型T

测试代码:

package demo.scala

import java.io.File

import scala.util.Random

object App5 {

  val finalA = 'a'

  def main(args: Array[String]): Unit = {
    val array = Array("a", "b", "c")
    val name = array(Random.nextInt(array.length))

    //    matchType('a') //case _
    //    matchType(Set(1, 2)) //case f
    //    matchType(Set("1")) //case f
    //    matchType(List(1, 2)) //case c
    //    matchType(Array("a", "b"))

    // matchArray(Array("b1"))
    //    matchArray(Array("A"))
    //    matchArray(Array("a1", "a2"))
    //    matchArray(Array("a1", "a2", "a3", "a4"))
    //    matchArray(Array("b1", "a2", "a3", "a4", "a5"))

    //    matchList(List("A"))
    //    matchList(List("B1", "B2"))
    //    matchList(List("C"))
    //    matchList(List("C", "C2", "C3"))

    //    matchType(1)
    //    matchType("abc")
    //    matchType(List("a", "b"))
    //    matchType(List(1, 2))
    //    matchType(Map("k1" -> 1, "k2" -> 2))
    //    matchType(Map("k" -> "v"))


    //    testSwitch('a')
    //    testSwitch(File.pathSeparatorChar)

    //    matchTuple(Tuple2(1, 0))
    funcB()
  }

  def funcA(name: String, grade: String): Unit = {
    grade match {
      case "A" => println("A")
      case "B" => println("B")
      case _ if name == "lisi" => println("lisi")
      case _ => println("C")
    }
  }

  def funcB() = {
    val test = "10"
    var arr = new Array[Object](2)
    arr(0) = "10"
    arr(1) = "12"

    val Array(`test`, x) = arr
    println(Array(`test`, x).map(println(_)))

    val E = 10
    var array = Array(E, 11)
    var Array(E, y) = array
    println(Array(E, y)(0))
  }

  def matchArray(array: Array[String]) = {
    array match {
      case Array("A") => println("A")
      case Array(a, b) => println(a + "," + b)
      case Array("a1", _*) => println("C")

      case Array("b1", rest@_*) => {
        if (rest.length == 0)
          println("空")
      }
      case _ => println("_")
    }
  }

  def matchList(list: List[String]) = {
    list match {
      case "A" :: Nil => println("A") //只有一个元素A的list
      case x :: y :: Nil => println(list(0) + "," + list(1)) //包含两个元素的list, (x是第一个元素,y是第二个元素!!!)
      case "C" :: tail => println("C") //C是第一个元素的list
    }
  }

  def matchType(objet: Any) = {
    //scala中国match是表达式,不是语句,它可以赋值给变量,例如下面的rs变量
    var rs = objet match {
      case Char => println("char")
      case a: Int => println("int type") //返回(),因为是unit类型
      case b: String => "string type" //返回字符串
      case c: List[String] => println("list[String]")
      case d: Map[String, Int] => println("map[String,Int]")
      case e: Map[_, _] => println("map[_,_]")
      case f: Set[String] => println("f: set")
      case g: Array[Int] => println("g:Array[Int]")
      case _ => println("other")
    }

    //    println("rs = " + rs)
  }

  def testSwitch(str: Char): Unit = {
    str match {
      case _ => println("other")
      case `finalA` => println("case 2")
      case separatorChar => println("case 1")

    }
  }

  def matchTuple(pair: Tuple2[Int, Int]) = {

    pair match {
      case (_, 0) | (0, _) => println("ok") //有分支时,只能用下划线,不能用其他变量名
      //      case (b, 0) | (0, b) => println("fail") //会报错
    }
  }

}

 

 

 

分享到:
评论

相关推荐

    Scala-学习资料-mht.rar

    它的语法与Java类似,但更加强调代码的表达性和简洁性,通过模式匹配、高阶函数等特性,使代码更加可读和易于维护。 1. 类型系统:Scala的类型系统非常强大,支持静态类型检查,同时也允许隐式转换和类型推断,这...

    scala学习笔记整理

    8. **模式匹配**:Scala的模式匹配不仅限于枚举类型,还可以用于解构类和集合,以及在case类和case对象上使用。这是一种强大的代码简化和错误检测工具。 9. **DSL(Domain Specific Language)**:Scala的语法特性...

    scala讲解笔记 入门及进阶 PDF文档1-5

    此外,还会介绍Scala中的模式匹配,这是Scala语言的一大特色,使得代码更加简洁和高效。 第二部分:"Scala入门及进阶-part02-类和对象.pdf" 主要讲解Scala的面向对象特性。这部分内容会详细介绍类的创建、对象的...

    Scala详细总结(精辟版++)

    - **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有强大的类型推断机制,这使得开发者可以在很多情况下省略类型声明。 - **模式匹配**:提供了一...

    scala的操作笔记

    - **模式匹配**:Scala支持强大的模式匹配功能,可用于字符串、类型以及复杂的数据结构。 - **样例类**:样例类是Scala中一种特殊的类,主要用于模式匹配。它们自动实现了许多有用的特性,如`equals`、`hashCode`和`...

    Testing in Scala-带书签目录超清文字版.pdf

    1. **Scala基础**:首先,书籍可能会介绍Scala的基础语法,如类型系统、模式匹配、高阶函数和类、特质等,这些都是编写测试代码的基础。 2. **Scala测试框架**:Scala社区中有多个流行的测试框架,如ScalaTest、...

    尚硅谷_韩顺平_Scala语言核心编程_PDF密码解除1

    - **模式匹配**:Scala的模式匹配功能可以用于解构复杂数据结构,简化代码。 - ** Actors模型**:Scala内置了对Akka框架的支持,方便构建并发和分布式系统。 5. **Scala开发环境搭建**: - **Windows**:在...

    scala-learn:scala学习笔记

    Scala的模式匹配功能强大,允许你根据值的不同形态执行不同的操作。这种特性在处理数据结构和解析输入时非常有用。 5. **集合框架** Scala的集合库是其一大亮点,提供了丰富的数据结构,如List、Set、Map等,并且...

    学习scala好的项目

    在学习过程中,理解Scala的类型推断和模式匹配也是关键。类型推断能让编译器自动确定变量的类型,提高代码的可读性和简洁性。模式匹配则是一种强大的工具,用于解构复杂数据结构并根据其结构执行不同的操作。 总的...

    scala学习笔记

    - **模式匹配**:使用 `case` 语句进行模式匹配,可以应用于多种场景,如解析数据结构、异常处理等。 - **隐式转换**:通过 `implicit` 关键字定义隐式转换规则,可以在编译时自动转换类型。 - **延迟初始化**:使用...

    scala学习资料

    模式匹配是Scala的一个强大特性,可以用于解构复杂的数据结构,简化条件判断和数据处理。 6. 高级语法:Scala的语法非常灵活,包括元组、匿名函数、偏函数、case类等,这些都让代码更加简洁和富有表达力。 7. 并发...

    scala-impatient-notes

    与Java不同,Scala的类可以有默认构造器和主构造器,通过`case class`关键字可以创建模式匹配友好的类。 2. 函数是一等公民:Scala中,函数可以赋值给变量、作为参数传递、作为返回值,这使得函数式编程成为可能。 ...

    scala-with-cats:scala with cats一书的笔记,习题

    此外,Scala还引入了模式匹配、高阶函数、类型推断等特性,提供了更高级的抽象工具。 Cats库是Scala中的一个关键部分,它提供了一套丰富的类型类,如Functor、Applicative、Monad等,这些类型类定义了常见的操作,...

    scala笔记:学习scala时的笔记

    - 模式匹配是Scala中的一个核心特性,它允许我们根据值的不同形式进行不同的操作,常用于解构复杂数据结构。 - 使用`case`关键字创建匹配模式,如`case class`实例、数组、集合等。 3. **函数与高阶函数**: - ...

    SCALA从入门到精通个人笔记含代码

    模式匹配 函数式编程基础 函数式编程说明 函数定义/声明 函数运行机制 递归 函数注意事项和细节 过程 惰性函数和异常 面向对象编程初级 类和对象 包 包对象 面向对象编程中级 封装 继承 多态 面向对象...

    Scala-notes:小号

    7. **模式匹配**:Scala的模式匹配允许我们解构复杂数据结构,如case class,增强了代码的可读性和简洁性。 8. **元编程**:Scala的反射和类型系统允许在运行时检查和操作类型,以及创建动态代码,增加了编程的灵活...

    udemy-scala-course

    学习这个课程,学员不仅可以了解Scala的基本语法和面向对象编程,还能接触到函数式编程的概念,如高阶函数、模式匹配和不可变数据结构。此外,由于Scala在大数据处理框架如Spark中的广泛应用,学员还将了解到如何...

    Scala笔记Markdown版本(至集合章节)

    总结,本Scala笔记Markdown版本涵盖了从语言基础到集合操作的重要内容,适合初学者入门和有经验的开发者巩固知识。通过学习,开发者将能够掌握Scala的核心特性和编程技巧,从而更好地利用Scala进行后端开发。

    Scala-Tutorial:Scala语法学习笔记与程式码范例from 韩顺平老师教学

    8. 模式匹配:用于处理数据结构,如case class和枚举。例如: ```scala sealed trait Color case object Red extends Color case object Green extends Color case object Blue extends Color val color = Red ...

    Scala_day01_scala_

    Scala还引入了模式匹配,这是一种强大的控制流构造,可以用于解构复杂的数据结构。通过模式匹配,你可以根据数据的不同类型或结构执行不同的操作。在学习笔记中,这可能以简单的case语句形式出现。 另外,Scala中的...

Global site tag (gtag.js) - Google Analytics