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