《scala函数式编程》之模式匹配和异常处理

package com.lyzx.day20181006

import java.io.{FileNotFoundException, FileReader, IOException}

class MatchTest {
  /**
    * match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。
    * match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,
    * 剩下的case不会继续匹配。
    * f1 和 f2 方法演示
    * @param x
    * @return
    */
  def f1(x:Any): String = x match{
    case 1 => "one"
    case 2 => "two"
    case 3 => "three"
    case _ => "many"
  }

  def f2(x:Any): String ={
      val result =
            x match {
              case 1 => "one"
              case 2 => "two"
              case 3 => "three"
              case _ => "many"
            }
    "最终结果为:"+result
  }

  /**
    * 使用了case关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。
    */
  def f3(): Unit ={
      val tom = new Person("tom",22)
      val jack = new Person("jack",55)
      val pony = new Person("pony",54)
      val robin = new Person("robin",53)

      for(item <- List(tom,jack,pony,robin)){
          item match {
              case Person("tom",age) => println("你好,tom   age="+age)
              case Person("jack",55) => println("你好Jack")
              case Person(name,age) => println("你好,陌生人,name["+name+"],age["+age+"]")
          }
      }
  }


  /**
    * case class 和普通class 的区别
    *
    */
  def f4(): Unit ={
    //1、实例化的时候case class可以不加new 可以加上,但是普通class必须加new关键字
    val people1 = new People("lyzx",22)
    val people2 = new People("lyzx",22)
    val person1 = Person("lyzx",22)
    val person2 = Person("lyzx",22)

    //2、toString的实现更漂亮
    println(people1)    //com.lyzx.day20181006.People@66d33a
    println(person1)    //Person(lyzx,22)

    //3、默认实现了equals 和hashCode
    println("普通类的equals:"+people1.equals(people2))  //false
    println("case类的equals:"+person1.equals(person2))  //true

    //4、case类实现了Serializable接口
    val people1IsSerializable  = people1.isInstanceOf[Serializable]
    val person1IsSerializable  = person1.isInstanceOf[Serializable]
    println("普通类是否实现了Serializable接口: "+people1IsSerializable)
    println("case类是否实现了Serializable接口: "+person1IsSerializable)

    //5、case class构造函数的参数是public级别的,我们可以直接访问
    println(person1.age)

    //6、支持匹配模式 在f3方法中可以看到
  }


  /**
    * 异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。
    * 因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。
    * 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。
    * 捕捉异常的catch子句,语法与其他语言中不太一样。
    * 在Scala里,借用了模式匹配的思想来做异常的匹配,
    * 因此,在catch的代码里,是一系列case字句,
    * finally 语句用于执行不管是正常处理还是有异常发生时都需要执行的步骤
    */
  def f5(): Unit ={
     try{
        val f = new FileReader("111")
     } catch {
       case e : FileNotFoundException => {
         e.printStackTrace()
         println("文件未找到异常")
       }
       case e : IOException =>{
         e.printStackTrace()
         println("IO异常")
       }
     }finally{
       println("i am finally's context")
     }
  }
}

case class Person(name:String,age:Int)
class People(name:String,age:Int)


object MatchTest{

  def main(args: Array[String]): Unit = {
      val t = new MatchTest
//    println(t.f2(2))
//      t.f3()
//      t.f4()
    t.f5()
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值