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