欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scala学习笔记08-模式匹配:match

程序员文章站 2022-06-14 17:16:25
...

模式匹配:match

  • Scala 中的模式匹配类似于Java 中的switch 语法,但是更加强大
  • scala中有match类似于java中的switch语句,模式匹配包含了一系列备选项,每个都开始于关键字 case ;每个备选项都包含了一个模式及一到多个表达式;箭头符号 => 隔开了模式和表达式。
  • match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。

注意:

  1. 如果所有case 都不匹配,那么会执行case _ 分支,类似于Java 中default 语句
  2. 如果所有case 都不匹配,又没有写case _ 分支,那么会抛出MatchError
  3. 每个case 中,不用break 语句,自动中断case
  4. 可以在match 中使用其它类型,而不仅仅是字符
  5. => 等价于java swtich 的 “ : ”
  6. => 后面的代码块到下一个case, 是作为一个整体执行,可以使用{} 扩起来,也可以不扩。
	/**
		1. match (类似java switch) 和case 是关键字
		2. 如果匹配成功, 则执行=> 后面的代码块.
		3. 匹配的顺序是从上到下,匹配到一个就执行对应的代码
		4. => 后面的代码块不要写break ,会自动的退出match
		5. 如果一个都没有匹配到,则执行case _ 后面的代码块
	*/
	def listPlus2(n:Any) :   Any ={
      n match {
        case x:Int => x + 2 //如果x为iint类型的,则返回x+2
        case _ => println("无法匹配")
    }

简单应用match

	object Match01 {
	  def main(args: Array[String]): Unit = {
		//java中有switch表示另一种分支
		/**
		  * 什么时候选择if.else或者switch
		  * 在java中如果分支条件全是选项的时候,判断的数量大于3时使用switch
		  * 但是在scala中,使用模式匹配的方式,scala中的模式匹配比java中的switch强大,因为在java中switch的条件是有限的
		  */
		var profession = 8
		profession match {
		  case 1 => println("警察")
		  case 2 => println("医生")
		  case 3 => println("教师")
		  case 4 => println("司机")
		  case _ => println("暂无此岗位") //当上面的case都没有匹配上,就执行这行语句,类似于java switch中的default
		}
	  }
	}

模式匹配中的守卫操作

	//模式匹配中的守卫操作
	object Match02_shouwei {

	  def main(args: Array[String]): Unit = {
	  
			var n = 50
			var t = "请假"
			//使用守卫操作,对同一个值进行不同条件的判断匹配
			//60一下为不合格,如果做够50而且有请假的话为合格
			n match {
			  case 40 => println("不合格")
			  case 50 if t.eq("请假") => println("合格") //守卫操作
			  case 60 => println("合格")
			  case 90 => println("良好")
			  case 100 => println("优秀")

			}
		}

	}

模式匹配:匹配数组&列表

	//模式匹配:匹配数组&列表
	object Match03_Array_LIst {

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

		//匹配数组
	//    var arr01 = Array[String]("苹果","香蕉","桃子","葡萄","梨")
		var arr01 = Array[String]("葡萄","梨")
		arr01 match {
		  case Array("香蕉") => println("arr01中只有香蕉") //当arr01中只有香蕉时才能匹配上
		  case Array("香蕉",_*) => println("arr01是以香蕉开头的") //当arr01中以有香蕉开头时才能匹配上
		  case Array("苹果",_*) => println("arr01是以苹果开头的") //当arr01中以苹果开头时才能匹配上
		  case Array(a) => println("arr01有一个元素") //当arr01中有1个元素时,可以匹配
		  case Array(a,b) => println("arr01有两个元素") //当arr01中有2个元素时,可以匹配
		  case Array(a,b,c) => println("arr01有三个元素") //当arr01中有3个元素时,可以匹配,超过3个就不行了
		  case _ => println("arr01没有匹配值")
		}

		println("-------匹配列表---------")
		//匹配列表
	//    var list01 = List("苹果","香蕉","桃子","葡萄","梨")
		var list01 = List("梨","香蕉")
	//    var list01 = List("梨")
		list01 match {
	//      case List("梨") => println("list01中只有梨")
		  case "梨"::Nil => println("list01中只有梨") //list最后一个元素必须加上::Nil
	//      case List("苹果",_*) => println("list01以苹果开头")
		  // "苹果"::tail  == 苹果, 香蕉, 桃子, 葡萄, 梨
		  case "苹果"::tail => println("list01以苹果开头")
		  //匹配数量
		  case a::Nil => println("list01中有1个元素") //当list01中有1个元素时可以匹配
		  case a::b::Nil => println("list01中有2个元素") //当list01中有2个元素时可以匹配
		  case a::b::c::Nil => println("list01中有3个元素") //当list01中有3个元素时可以匹配,最多匹配3个元素
		  case _ => println("list01没有匹配值")
		}

	//    println(list01.tail) //List(香蕉, 桃子, 葡萄, 梨)
	  }

	}
相关标签: scala