Scala_模式匹配的一些感悟跟重点

模式匹配

1.普通匹配

//简单不聊
//todo 常量匹配
    def testAge(age:Int)={
      age match {
        case 10 => println("10")
        case 20 => println("20")
        case _ => println("其他")
      }
    }
    testAge(20)

    //todo 类型匹配
    def testType(x:Any)={
      x match {
        case x:Int => println("整型")
        case x:List[Int] => println("List")
        case x:String =>println("字符串")
        case _ => println("其他")
      }
    }
    testType(List("a"))//类型不考虑
  }

  //todo 匹配集合
  private val list = List(1, 2, 5)
  list match {
    case first::second::rest => println(first + "_" + second + "_" + rest)
    case _ => println("some else")
  }

  //todo 匹配元组
  for (tuple <- Array((0, 1), (1, 0), (1, 1), (1, 0, 2))) {
    val result = tuple match {//可以返回
      case (0, _) => "0 ..." //是第一个元素是0的元组
      case (y, 0) => "" + y + "0" // 匹配后一个元素是0的对偶元组
      case (a, b) => "" + a + " " + b
      case _ => "something else" //默认
    }
    println(result)
  }

2.匹配对象

//todo 匹配对象
  //类的构造方法中参数使用var或者val声明
  //这个参数就可以直接作为类的属性使用[圈起来]
  //var参数可以修改的,val参数不可以修改
  class User(val name:String,val age:Int)
  object User{
    def apply(name: String, age: Int): User = new User(name, age)
    def unapply(user: User): Option[(String, Int)] = Option(user.name, user.age)
  }

  val user= User("zhangsan", 30)
  user match{
    case User("张三",30) => println("对象没有问题")
    case _ => println("不匹配")
  }

3.样例类[模式匹配应该学的地方]

/**
 * @author Jinxin Li
 * @create 2020-10-28 18:50
 * 模式匹配
 * 马丁专门为模式匹配的对象匹配创建了特殊的类,样例类,就是在class前增加case关键字
 * 这个类可以当做普通类来用,也能生成特殊类使用
 * 编译器在遍历样例类时,会自动生成伴生对象,apply方法,unapply方法
 * 同时这个类默认实现了可序列化接口
 */
object Match01_match {
  //样例类
  case class User(val name: String, val age: Int)

  def main(args: Array[String]): Unit = {
    val user = User("zhangsan", 30)
    user match {
      case User("张三", 30) => println("对象没有问题")
      case _ => println("不匹配")
    }
  }
}

说明:

  1. 样例类就是使用case关键字声明的类

  2. 样例类仍然是类,和普通类相比,只是其自动生成了伴生对象,并且伴生对象中自动提供了一些常用的方法,如apply、unapply、toString、equals、hashCode和copy。

  3. 样例类是为模式匹配而优化的类,因为其默认提供了unapply方法,因此,样例类可以直接使用模式匹配,而无需自己实现unapply方法。

  4. 构造器中的每一个参数都成为val,除非它被显式地声明为var(不建议这样做)

4.变量匹配

object Match01_match {
  def main(args: Array[String]): Unit = {
    val (name, age) = ("zhangsan", 30)
    //1.直接声明对应
    println(name)
    println(age)
    
    //2.map声明,循环匹配
    val map = Map(("a",1),("b",2))
    
    for((k,v) <- map){//打印的时候直接匹配
      println(k + "," + v)
    }

    for((k,2) <- map){//匹配也能做过滤,将v为2的数进行过滤
      println(k)
    }
  }
}

5.匹配函数的参数[要重点学习的地方]

object Match01_match {
  def main(args: Array[String]): Unit = {
    val list = List(("a",1),("b",2),("c",3))
    list.map{case (string,int)=>(string,int*2)}//这里传递出两个参数显然是不合适的
    //注意1.要使用case
    //    2.注意使用花括号
  }
}

5.1 过滤功能

object Match01_match {
    //过滤出第二个数的为奇数
  def main(args: Array[String]): Unit = {
    val list = List(
      ("a",1),("b",1),("c",2)
    )
    list.filter{
      case (_,cont) => {cont%2 ==1}//使用模式匹配
    }
  }
}

6.偏函数

对满足条件的一部分数据处理为偏函数

//一般情况下偏函数就是模式匹配,使用case
object Match01_match {
  //将该List(1,2,3,4,5,6,"test")中的Int类型的元素加一,并去掉字符串。
  def main(args: Array[String]): Unit = {
    val list = List(1,2,3,4,5,6,"test")
    //采集数据,符合条件的数据被采集并做处理,这样的函数称为偏函数
    val result = list.collect{
      case i:Int => i + 1
    }
    println(result)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值