• scala记录(4)trait,模式匹配,样例类


    1.Actor Model

    1.1概念理解

    Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。

    与接口不同的是,它还可以定义属性和方法的实现。

    一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承,当继承多个trait时,第一个用extends,其他的都用with。

    Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。

    1.2举例:trait中带属性带方法实现

    注意:

    • 继承的多个trait中如果有同名的方法和属性,必须要在类中使用“override”重新定义。
    • trait中不可以传参数
    trait Read {
      val readType = "Read"
      val gender = "m"
      def read(name:String){
        println(name+" is reading")
      }
    }
    
    trait Listen {
      val listenType = "Listen"
      val gender = "m"
      def listen(name:String){
        println(name + " is listenning")
      }
    }
    
    class Person() extends Read with Listen{
      override val gender = "f"
    }
    
    object test {
      def main(args: Array[String]): Unit = {
        val person = new Person()
        person.read("zhangsan")
        person.listen("lisi")
        println(person.listenType)
        println(person.readType)
        println(person.gender)
        
      }
    }

    1.3举例:trait中带方法不实现

    object Lesson_Trait2 {
      def main(args: Array[String]): Unit = {
        val p1 = new Point(1,2)
        val p2 = new Point(1,3)
        println(p1.isEqule(p2))
        println(p1.isNotEqule(p2))
      }
    }
    
    trait Equle{
      def isEqule(x:Any) :Boolean 
      def isNotEqule(x : Any)  = {
        !isEqule(x)
      }
    }
    
    class Point(x:Int, y:Int) extends Equle {
      val xx = x
      val yy = y
    
      def isEqule(p:Any) = {
        p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
      }
      
    }

    首先,需要使用isInstanceOf 判断对象是否为指定类的对象,如果是的话,则可以使用 asInstanceOf 将对象转换为指定类型;

    Ø  注意:p.isInstanceOf[XX] 判断 p 是否为 XX 对象的实例;p.asInstanceOf[XX] 把 p 转换成 XX 对象的实例

    Ø  注意:如果没有用isInstanceOf 先判断对象是否为指定类的实例,就直接用 asInstanceOf 转换,则可能会抛出异常;

    Ø  注意:如果对象是 null,则isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;

    2 模式匹配match

    2.1概念理解:

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

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

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

    2.2代码及注意点

    • 模式匹配不仅可以匹配值还可以匹配类型
    • 从上到下顺序匹配,如果匹配到则不再往下匹配
    • 都匹配不上时,会匹配到case _ ,相当于default
    • match 的最外面的”{ }”可以去掉看成一个语句
    object Lesson_Match {
      def main(args: Array[String]): Unit = {
        val tuple = Tuple6(1,2,3f,4,"abc",55d)
        val tupleIterator = tuple.productIterator
        while(tupleIterator.hasNext){
          matchTest(tupleIterator.next())
        }
        
      }
      /**
       * 注意点:
       * 1.模式匹配不仅可以匹配值,还可以匹配类型
       * 2.模式匹配中,如果匹配到对应的类型或值,就不再继续往下匹配
       * 3.模式匹配中,都匹配不上时,会匹配到 case _ ,相当于default
       */
      def matchTest(x:Any) ={
        x match {
          case x:Int=> println("type is Int")
          case 1 => println("result is 1")
          case 2 => println("result is 2")
          case 3=> println("result is 3")
          case 4 => println("result is 4")
          case x:String => println("type is String")
    //      case x :Double => println("type is Double")
          case _ => println("no match")
        }
      }
      
    }

    3 样例类(case classes)

    3.1概念理解

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

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

    3.2例子:结合模式匹配的代码

    case class Person1(name:String,age:Int)
    
    object Lesson_CaseClass {
      def main(args: Array[String]): Unit = {
        val p1 = new Person1("zhangsan",10)
        val p2 = Person1("lisi",20)
        val p3 = Person1("wangwu",30)
        
        val list = List(p1,p2,p3)
        list.foreach { x => {
          x match {
            case Person1("zhangsan",10) => println("zhangsan")
            case Person1("lisi",20) => println("lisi")
            case _ => println("no match")
          }
        } }
        
      }
    }
  • 相关阅读:
    (原创)分享一下最近搞的tiny210V2从nand启动支持(K9GAG08U0F).
    (转)uboot 与系统内核中 MTD分区的关系
    (转)mkimage制作linux内核映像 即uImage是怎么制作的
    ExtJs 一些属性备忘录
    CSS 元素选择器
    为什么匿名内部类参数必须为final类型
    Unbuntu 14.04 64位 搭建交叉编译环境
    eclipse调试运行
    Linux中cat命令的用法
    android之json
  • 原文地址:https://www.cnblogs.com/kpsmile/p/10374753.html
Copyright © 2020-2023  润新知