当前位置:网站首页>scala 高级

scala 高级

2022-08-11 10:53:00 S_ng

1、模式匹配  概念介绍
o 类比于 java 中的 switch...case,但比其要强大、灵活很多。 o 旨在解决符合一定模式(值也是模式的一种)情况下的匹配与处
理问题。
 使用说明
o 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。
每个备选项都包含了一个模式及一到多个表达式。箭头符号=>隔
开了模式和表达式。
o 选择器 match {备选项},match 表达式通过以代码编写的先后次
序尝试每个模式来完成计算,只要发现有一个匹配的 case,剩下
的 case 不会继续匹配。
 应用示例
o 经典示例(同类型)

def main(args: Array[String]) {
println(selfMatch("javase"))
}
def selfMatch(x: String): String = x match {
case "javase" => "Java 开发标准版"
case "javaee" => "Java 开发企业版"
case _ => "其它 Java 版本 " }
不同类型匹配示例
def main(args: Array[String]) {
println(selfMatch("one"))
println(selfMatch(2))
println(selfMatch("III"))
println(selfMatch("five"))
}
def selfMatch(x: Any): Any = x match {
case "one" => 1
case 2 => "two"
case "III" => "希腊数字 3"
case _ => "其它不认识了" }
复杂表达式匹配示例
def main(args: Array[String]) {
println(selfMatch(1))
println(selfMatch(10))
println(selfMatch(22))
println(selfMatch(78))
}
def selfMatch(x: Int): String = x match {
case _ if x<12 => "幼年"
case _ if x<18 => "未成年"
case _ if x>=18 && x<60 => "成年"
case _ => "已步入老年了!"
}
类型模式匹配示例
object TestPatternMatch {
def main(args: Array[String]) {
println(selfMatch(1))
println(selfMatch("10"))
println(selfMatch(new TestPatternMatch()))
println(selfMatch(new Object()))
}
def selfMatch(x: Any): Any = x match {
case _:Int => "传入的是整型"
case _:String => "传入的是字符串"
case _:TestPatternMatch => "传入的数据类型是
TestPatternMatch"
case _ => "不知道什么类型" } }
//定义一个空类,便于上边的类型模式匹配
class TestPatternMatch{
 
}
2、正则表达式
概念说明
o 与 Java 当中的正则表达式的作用完全相同
3、异常处理
概念说明
o 异常处理机制与 Java 语言相似,其异常类也采用了 Java 类,并
没有重写o 主要包括异常抛出和异常捕获两大方面。
o 抛出异常用 throw,声明可能的异常与 Java 不同,采用的注解式
@throws(classOf[SomeException])
o 捕获异常,采用的 try...catch 的模式匹配的形式
o Scala 里不需要捕获检查异常:checked exception,也不是必须
把它们声明在 throws 子句中。
可以用@throws 标注声明一个 throws 子句,但这不是必需的
该机制最大的问题是如果遇到异常没有补捉,则程序会终止,如
果进行了捕捉,可以按照程序设定的方式去进行,而不必须停
止。
应用示例
o 方法内抛出异常
def main(args: Array[String]) {
throw new Exception("测试异常抛出!");
}
方法定义时声明要抛出异常
object TestException {
def main(args: Array[String]) {
callMe()
}@throws(classOf[Exception])
def callMe() = {
println("i am in callMe method") } }

捕获异常

def main(args: Array[String]) {
try {
val f = new FileReader("input.txt") } catch {
case ex: FileNotFoundException => {
println("不好意思,文件没有找到!") }
case ex: IOException => {
println("不明原因的 IO 异常!") } } }
捕获异常时候-加入 finally 收尾
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt") } catch {
case ex: FileNotFoundException => {
println("不好意思,文件没有找到!") }
case ex: IOException => {
println("不明原因的 IO 异常!") } } finally {
println("无论 try...catch 如何,都会执行 finally,我在
finally 中!") } }
4、提取器(Extractor)
概念说明
o 提取器是从传递给它的对象中提取出构造该对象的参数。
o 提取器是一个带有 unapply 方法的对象。unapply 方法算是 apply
方法的反向操作:unapply 接受一个对象,然后从对象中提取
值,提取的值通常是用来构造该对象的值。
o apply 与 unapply 方法是互反的,apply 用于构造一个对象,而不
需要用 new 方法是其重要特点,unapply 是反向解开这个对象,
将其对应的参数值提取出来。
应用举例
o 提取远程登陆信息中的用户名和 IP 地址
def main(args: Array[String]) {
var obj = apply("tianliang", "192.168.1.33");
println("Apply 方法形成一个对象: " + obj);
println("Unapply 方法反向提取该对象中的参数:" +
unapply(obj));
println("Unapply 方法反向提取该对象中的参数: " +
unapply("我不是一个登陆地址"));
}
// 注入方法 (可选)
def apply(username: String, ip: String) = {
username + "@" + ip
}
// 提取方法(必选)
def unapply(str: String): Option[(String, String)] =
{
val parts = str split "@"
if (parts.length == 2) {
Some(parts(0), parts(1))
} else {
None
} }
提取器模式匹配
o apply 与 unapply 配合示例
object TestUnapplyPatternMatch {
def main(args: Array[String]) {
//自动调用 TestUnapplyPatternMatch 的 apply 方法
val loginInfo = TestUnapplyPatternMatch("tianliang", "192.168.1.33")
println(loginInfo)
loginInfo match {
//unapply 被自动调用
case TestUnapplyPatternMatch(username, ip) => println(username + "
登陆了" + ip + " 这台机器!")
case _ => println(loginInfo) } }
def apply(username: String, ip: String) = username + "@" + ip
def unapply(loginInfo: String): Option[(String, String)] = {
val parts = loginInfo split "@"
if (parts.length == 2) {
Some(parts(0), parts(1))
} else {
None
} } }

原网站

版权声明
本文为[S_ng]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_52464817/article/details/126274152