博主接触过Java,Python,C,C++几门主流语言,但今天在学习Scala中又见识到了新奇的地方,是从其他语言没接触过的。特分享出来供大家参考。
有关Scala的模式匹配问题,
//匹配样例类
//scala可以使用模式匹配来匹配样例类,从而可以快速获取样例类中的成员数据。
// 定义样例类
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask
val msg1 = SubmitTask("001", "task-001")
val msg2 = HeartBeat(1000)
val msg3 = CheckTimeOutTask
val list = List(msg1, msg2, msg3)
可以使用@符号分隔case语句,用来获取用于匹配的整个示例对象
list(0) match {
// obj表示获取用于匹配的样例对象,而id,name表示获取样例中的元素
case obj @ SubmitTask(id, name) => println(s"id=$id, name=$name");println(s"样例类:$obj")
case HeartBeat(time) => println(s"time=$time")
case CheckTimeOutTask => println("检查超时")
}
这段代码的阅读我想大多数人是没问题的,然而关键是Scala的模式匹配加上正则表达式会是怎样呢?让我们再看一段代码
//用来匹配邮箱
val emailRE = """.+@(.+)\..+""".r
val emailList = List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")
println("邮箱的运营公司为")
emailList.foreach {
// email表示获取用于匹配的样例对象,而company表示获取样例中的元素
case email@emailRE(company) => println(s"$email => ${company}")
case _ => println("未知")
}
代码运行结果是:
邮箱的运营公司为
38123845@qq.com => qq
a1da88123f@gmail.com => gmail
zhansan@163.com => 163
未知
这里我相信大多数人都和博主一样好奇,为啥他就只返回公司名称呢?
博主在询问老师后说是正则表达式问题,我就开始怀疑@后加了括号的正则匹配,于是做出了修改如下
val emailRE = """(.+)@(.+)\..+""".r
val emailList = List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")
println("邮箱的运营公司为")
emailList.foreach {
// email表示获取用于匹配的样例对象,而company表示获取样例中的元素
case email@emailRE(name,company) => println(s"$email => ${name}=> ${company} ")
case _ => println("未知")
}
不出意外的结果显示出了新的结果:
邮箱的运营公司为
38123845@qq.com => 38123845=> qq
a1da88123f@gmail.com => a1da88123f=> gmail
zhansan@163.com => zhansan=> 163
未知
哈哈哈,所谓的模式匹配,是不是很神奇呢?博主也是第一次遇到,见此作为记录。
如需转载,请说明出处。