Scala之提取器入门

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 方法是可选的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值