Scala 中的 Match Case 模式匹配、偏函数与样式类

目录

一、模式匹配(Match Case)

二、偏函数(PartialFunction)

三、样例类


一、模式匹配(Match Case)

Scala 提供了强大的模式匹配机制,应用也非常广泛。

一个模式匹配包含了一系列备选项,每个都开始于关键字 case。

每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。

模式匹配(Match Case)相当于Java中的Switch case default

模式匹配的用法如下:

package com.bjsxt.scala

/**
 * Match 模式匹配
 * match case 相当于Java中的Switch case default一样
 * 1.case _ 什么都匹配不上的时候用的,相当于java中default,放最后
 * 2.match 可以匹配值还可以匹配类型,值的话就直接传入值就行,类型就传入 参数名:类型
 * 3.匹配过程中会有数值的转换,如1.0会自动转为Int类型的1,但1.2就不会
 * 4.从上到下匹配,匹配上之后会自动终止,不往下匹配了
 * 5.模式匹配外部的"{.....}"大括号可以省略,因为match模式匹配只是一句
 */
object Lesson_Match {
  def main(args: Array[String]): Unit = {
    val tp = (1,1.2,"abc",'a',true)
    val iter: Iterator[Any] = tp.productIterator
    iter.foreach(MatchTest)//等价于iter.foreach(s =>{MatchTest(s)}) == iter.foreach(MatchTest(_)})
  }

  // * 5.模式匹配外部的"{.....}"大括号可以省略,因为match模式匹配只是一句
  def MatchTest(o:Any): Unit ={
    o match {
      case 1=>println("value is 1")
        // * 2.match 可以匹配值还可以匹配类型,值的话就直接传入值就行,类型就传入 参数名:类型
      case i:Int => println(s"type is Int,value = $i")
      case d:Double => println(s"type is Double,value = $d")
      case s:String => println(s"type is String,value = $s")
      case 'a' => println("value is c")
      case _ => println("no match...")// * 1.case _ 什么都匹配不上的时候用的,相当于java中default,放最后

    }
  }
}

注意点:

  1. 模式匹配不仅可以匹配值还可以匹配类型
  2. 从上到下顺序匹配,如果匹配到则不再往下匹配
  3. 都匹配不上时,会匹配到case _ ,相当于default
  4. match 的最外面的”{ }”可以去掉,因为match{...}可以看成是一个语句

二、偏函数(PartialFunction)

如果一个方法中没有 match 只有case,这个函数可以定义成 PartialFunction 偏函数。偏函数定义时,不能使用括号传参,默认定义 PartialFunction 中传入一个值,匹配上了对应的case,返回一个值。PartialFunction 当中给定的类型是需要匹配的类型和返回值的类型。
偏函数的用法如下:

package com.bjsxt.scala

/**
 * 偏函数,只能匹配一个值,匹配上了返回对应的值
 * PartialFunction[A,B] A是匹配的类型,B是匹配上返回的类型
 */
object Lesson_PartialFun {
  //定义偏函数,偏函数不能传参,定义标准形式:def 函数名:PartialFunction[A,B] ={}
  //这里的模式匹配类型只能是一种
  def MyTest:PartialFunction[String,Int] = {
    case "abc" => 2
    case "a" => 1
    case _ => 200
  }
  def main(args: Array[String]): Unit = {
    val result: Int = MyTest("abdc")
    println(result)
  }
}

三、样例类

使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。

注意点:

(1)样例类默认帮你实现了toString,equals,copy和hashCode等方法。
(2)样例类可以new, 也可以不用new

package com.bjsxt.scala

/**
 * 样例类(case classes)
 * 1.使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类
 * 实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,
 * 它将帮你实现setter和getter方法
 * 2.样例类默认帮你实现了toString,equals,copy和HashCode等方法
 * 3.样例类可以new,也可以不用new
 */
//定义样例类
case class Person1(var name:String,age:Int)

object CaseClass {
  def main(args: Array[String]): Unit = {
    val p1 = new Person1("zhangsan", 19)
    val p2 = new Person1("zhangsan", 19)
    // * 3.样例类可以new,也可以不用new
    val p3 = Person1("zhangsan", 32)
    //这里用的equals、toString都是已经实现好的,不然比较和打印的都是地址
    println(p1.equals(p2))
    println(p3)
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值