Scala之提取器入门

导读:本篇文章讲解 Scala之提取器入门,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、需求

给定一个字符串,如果它是有效的Email地址,返回用户名、域名,否则返回:无效的Email地址。
举例:
输入:liudehua@gmail.com
输出:
liudehua
gmail.com

输入:liudehua gmail.com
输出:
无效的Email地址

2、传统实现

//V1.scala
object V1 {
  def resolveEmail(str: String) : Unit = {
    val parts = str split "@"
    if (parts.length == 2) {
      println(parts(0))
      println(parts(1))
    } else {
      println("无效的Email地址")
    }
  }
}
// Test.scala
object Test {
  def main(args: Array[String]): Unit = {
    val s = "liudehua@gmail.com"
    V1.resolveEmail(s)
    //V2.resolveEmail(s)

    val s2 = "liudehua gmail.com"
    V1.resolveEmail(s2)
    //V2.resolveEmail(s2)
  }
}

3、使用Scala提取器特性实现

//V2.scala
object V2 {
  def unapply(str: String): Option[(String, String)] = {
    val parts = str split "@"
    if (parts.length == 2) Some(parts(0), parts(1)) else None
  }

  def resolveEmail(str: String) : Unit = {
    str match{
      case V2(user, domain) => {
        println(user)
        println(domain)
      }
      case _ => println ("无效的Email地址")
    }
  }
}
// Test.scala
object Test {
  def main(args: Array[String]): Unit = {
    val s = "liudehua@gmail.com"
    //V1.resolveEmail(s)
    V2.resolveEmail(s)

    val s2 = "liudehua gmail.com"
    //V1.resolveEmail(s2)
    V2.resolveEmail(s2)
  }
}

Scala提取器特性好像也没有什么特别之处,不是吗!?

4、需求变更

给定一个字符串,如果它是有效的Email地址,且用户名部分是由“大写、叠词”组成的,返回叠词、域名,否则返回:无效的Email地址,或者用户名不满足“大写且叠词”。
举例:
输入:DIDI@hotmail.com
输出:
DI
hotmail.com

输入:DIDO@hotmail.com
输出:无效的Email地址,或者用户名不满足“大写且叠词

输入:didi@hotmail.com
输出:无效的Email地址,或者用户名不满足“大写且叠词

输入:didi hotmail.com
输出:无效的Email地址,或者用户名不满足“大写且叠词

5、传统实现

6、使用Scala提取器特性实现

//Twice.scala
object Twice {
  def unapply(s: String): Option[String] = {
    val length = s.length / 2
    val half = s.substring(0, length)
    if (half == s.substring(length)) Some(half) else None
  }
}
//UpperCase.scala
object UpperCase {
  def unapply(s: String): Boolean = s.toUpperCase == s
}
//V3.scala
object V3 {
  def resolveEmail(str: String) : Unit = {
    str match{
      case V2(Twice(x @ UpperCase()), domain) => {
        println(x)
        println(domain)
      }
      case _ => println ("无效的Email地址,或者用户名不满足“大写且叠词”")
    }
  }

  def main(args: Array[String]): Unit = {
    val s = "DIDI@hotmail.com"
    resolveEmail(s)

    val s2 = "DIDO@hotmail.com"
    resolveEmail(s2)

    val s3 = "didi@hotmail.com"
    resolveEmail(s3)

    val s4 = "didi hotmail.com"
    resolveEmail(s4)
  }
}

这行代码最拉风:

case V2(Twice(x @ UpperCase()), domain) => {

官方定义:提取器对象是一个包含有 unapply 方法的单例对象。apply 方法就像一个构造器,接受参数然后创建一个实例对象,反之 unapply 方法接受一个实例对象然后返回最初创建它所用的参数。unapply 方法是必须的,apply 方法是可选的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/17231.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!