Option类型
使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。
定义
scala中,Option类型来表示可选值。这种类型的数据有两种形式:
- Some(x):表示实际的值
- None:表示没有值
- 使用getOrElse方法,当值为None是可以指定一个默认值
示例一
示例说明
- 定义一个两个数相除的方法,使用Option类型来封装结果
- 然后使用模式匹配来打印结果
- 不是除零,打印结果
- 除零打印异常错误
参考代码
/**
* 定义除法操作
* @param a 参数1
* @param b 参数2
* @return Option包装Double类型
*/
def dvi(a:Double, b:Double):Option[Double] = {
if(b != 0) {
Some(a / b)
}
else {
None
}
}
def main(args: Array[String]): Unit = {
val result1 = dvi(1.0, 5)
result1 match {
case Some(x) => println(x)
case None => println("除零异常")
}
}
示例二
示例说明
- 重写上述案例,使用getOrElse方法,当除零时,或者默认值为0
参考代码
def dvi(a:Double, b:Double) = {
if(b != 0) {
Some(a / b)
}
else {
None
}
}
def main(args: Array[String]): Unit = {
val result = dvi(1, 0).getOrElse(0)
println(result)
}
偏函数
偏函数可以提供了简洁的语法,可以简化函数的定义。配合集合的函数式编程,可以让代码更加优雅。
定义
- 偏函数被包在花括号内没有match的一组case语句是一个偏函数
- 偏函数是PartialFunction[A, B]的一个实例
- A代表输入参数类型
- B代表返回结果类型
示例一
示例说明
定义一个偏函数,根据以下方式返回
输入 | 返回值 |
---|---|
1 | 一 |
2 | 二 |
3 | 三 |
其他 | 其他 |
参考代码
// func1是一个输入参数为Int类型,返回值为String类型的偏函数
val func1: PartialFunction[Int, String] = {
case 1 => "一"
case 2 => "二"
case 3 => "三"
case _ => "其他"
}
println(func1(2))
示例二
示例说明
- 定义一个列表,包含1-10的数字
- 请将1-3的数字都转换为[1-3]
- 请将4-8的数字都转换为[4-8]
- 将其他的数字转换为(8-*]
参考代码
val list = (1 to 10).toList
val list2 = list.map{
case x if x >= 1 && x <= 3 => "[1-3]"
case x if x >= 4 && x <= 8 => "[4-8]"
case x if x > 8 => "(8-*]"
}
println(list2)
正则表达式
在scala中,可以很方便地使用正则表达式来匹配数据。
定义
Regex类
-
scala中提供了Regex类来定义正则表达式
-
要构造一个RegEx对象,直接使用String类的r方法即可
-
建议使用三个双引号来表示正则表达式,不然就得对正则中的反斜杠来进行转义
val regEx = """正则表达式""".r
findAllMatchIn方法
- 使用findAllMatchIn方法可以获取到所有正则匹配到的字符串
示例一
示例说明
- 定义一个正则表达式,来匹配邮箱是否合法
- 合法邮箱测试:qq12344@163.com
- 不合法邮箱测试:qq12344@.com
参考代码
val r = """.+@.+\..+""".r
val eml1 = "qq12344@163.com"
val eml2 = "qq12344@.com"
if(r.findAllMatchIn(eml1).size > 0) {
println(eml1 + "邮箱合法")
}
else {
println(eml1 + "邮箱不合法")
}
if(r.findAllMatchIn(eml2).size > 0) {
println(eml2 + "邮箱合法")
}
else {
println(eml2 + "邮箱不合法")
}
示例二
示例说明
找出以下列表中的所有不合法的邮箱
"38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com"
参考代码
val emlList =
List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")
val regex = """.+@.+\..+""".r
val invalidEmlList = emlList.filter {
x =>
if (regex.findAllMatchIn(x).size < 1) true else false
}
println(invalidEmlList)
示例三
示例说明
-
有以下邮箱列表
"38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com"
-
使用正则表达式进行模式匹配,匹配出来邮箱运营商的名字。例如:邮箱zhansan@163.com,需要将163匹配出来
- 使用括号来匹配分组
-
打印匹配到的邮箱以及运营商
参考代码
// 使用括号表示一个分组
val regex = """.+@(.+)\..+""".r
val emlList =
List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")
val emlCmpList = emlList.map {
case x@regex(company) => s"${x} => ${company}"
case x => x + "=>未知"
}
println(emlCmpList)