• 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方法。

     

  • 相关阅读:
    Python 数据处理 正则匹配,清洗脏数据
    Pycharm自用激活码
    编程杂谈 集群与分布式
    win10 向右键添加管理员级CMD
    win10 笔记本键盘永久屏蔽Numlk键
    Golong 环境搭建
    python 各种锁机制归纳整理
    MySQL数据库操作
    Web框架本质
    Django框架
  • 原文地址:https://www.cnblogs.com/0205gt/p/11003980.html
Copyright © 2020-2023  润新知