zoukankan      html  css  js  c++  java
  • Scala实践9

    1、特征

          Traits用于在类之间共享接口和字段。它们类似于Java 8的接口。类和对象可以扩展特征,但是特征不能被实例化,因此没有参数。

    • 定义一个特征

         最小特征只是关键字trait和标识符:

    trait Color
    

     特征作为泛型类型和抽象方法特别有用。

    trait Iterator[A] {
      def hasNext: Boolean
      def next(): A
    }
    

      扩展(与Java中的实现类似)trait Iterator[A]需要一个类型A和方法实现hasNextnext

    • 使用特征

           使用extends关键字来扩展特征。然后使用override关键字实现特征的任何抽象成员

    trait Iterator[A] {
      def hasNext: Boolean
      def next(): A
    }
    
    class IntIterator(to: Int) extends Iterator[Int] {
      private var current = 0
      override def hasNext: Boolean = current < to
      override def next(): Int =  {
        if (hasNext) {
          val t = current
          current += 1
          t
        } else 0
      }
    }
    
    
    val iterator = new IntIterator(10)
    iterator.next()  //returns 0
    iterator.next()  //returns 1
    

      此类IntIterator将参数to作为上限。extends Iterator[Int]意味着该next方法必须返回一个Int。

    • 分型

          在需要给定特征的情况下,可以使用特征的子类型。

    import scala.collection.mutable.ArrayBuffer
    
    trait Pet {
      val name: String
    }
    
    class Cat(val name: String) extends Pet
    class Dog(val name: String) extends Pet
    
    val dog = new Dog(name="Harry")
    val cat = new Cat(name="Sally")
    
    val animals = ArrayBuffer.empty[Pet]
    animals.append(dog)
    animals.append(cat)
    animals.foreach(pet => println(pet.name))
    

      trait Pet有一个抽象字段name,由Cat和Dog在其构造函数中实现。在最后一行,我们调用pet.name哪个必须在特征的任何子类型中实现Pet

    2、正则表达式

           正则表达式是可用于在数据中查找模式(或缺少模式)的字符串。可以使用该.r方法将任何字符串转换为正则表达式

    import scala.util.matching.Regex
    
    val numberPattern: Regex = "[0-9]".r
    
    numberPattern.findFirstMatchIn("awesomepassword11") match {
      case Some(_) => println("Password OK")
      case None => println("Password must contain a number")
    }
    

      结果如下:

    在上面的例子中,numberPattern是一个Regex (正则表达式),用它来确保密码包含一个数字。

    3、提取器对象

        提取器对象是具有unapply方法 的对象,虽然apply方法就像一个构造函数,接受参数并创建一个对象,但是unapply接受一个参数并试图回馈参数,通常用于模式匹配和部分功能。

    import scala.util.Random
    
    object CustomerID {
      def apply(name:String) = s"$name--${Random.nextLong}"
    
      def unapply( customerID:String): Option[String] ={
        val stringArray:Array[String]=customerID.split("--")
        if(stringArray.tail.nonEmpty) Some(stringArray.head) else None
      }
      def main(args: Array[String]): Unit = {
        val customer1ID = CustomerID("harry--aaaaaa--jurry")
        customer1ID match {
          case CustomerID(name) => println(name)  
          case _ => println("Could not extract a CustomerID")
        }
      }
    }
    

      apply方法CustomerID从创建一个字符串name,unapply做反拿到name回来。当我们调用时CustomerID("harry--aaaaaa--jurry"),这是调用的简写语法CustomerID.apply("harry--aaaaaa--jurry")。当我们打电话时case CustomerID(name) => println(name),我们正在调用unapply方法。

     

  • 相关阅读:
    Android开发 使用 adb logcat 显示 Android 日志
    【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    C语言 结构体相关 函数 指针 数组
    C语言 命令行参数 函数指针 gdb调试
    C语言 指针数组 多维数组
    Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
    C语言 内存分配 地址 指针 数组 参数 实例解析
    CRT 环境变量注意事项
    hadoop 输出文件 key val 分隔符
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
  • 原文地址:https://www.cnblogs.com/0205gt/p/11003980.html
Copyright © 2011-2022 走看看