Scala系列19:Option类型,隐函数以及正则表达式的使用详解

2020-09-28 19:55发布

目录

0. Option类型

0.1示例演示

1.偏函数的使用

1.scala中偏函数的定义

2.示例说明

2.Scala中正则表达式的使用

2.1 语法格式

2.2示例说明


  • None:表示没有值

  • 使用getOrElse方法,当值为None是可以指定一个默认值

0.1示例演示

示例1

  • 定义一个两个数相除的方法,使用Option类型来封装结果

  • 然后使用模式匹配来打印结果

    • 不是除零,打印结果

    • 除零打印异常错误

参考代码

  1. /**

  2. * 定义除法操作

  3. * @param a 参数1

  4. * @param b 参数2

  5. * @return Option包装Double类型

  6. */

  7. package com.robot.scalademo


  8. object _08ObjectDemo {

  9. def dvi(a:Double, b:Double):Option[Double] = {

  10. if(b != 0) {

  11. Some(a / b)

  12. }

  13. else {

  14. None

  15. }

  16. }

  17. def main(args: Array[String]): Unit = {

  18. val result1 = dvi(1.0, 5)


  19. result1 match {

  20. case Some(x) => println(x) //0.2

  21. case None => println("除零异常")

  22. }}}

示例2:

  • 重写上述案例,使用getOrElse方法,当除零时,或者默认值为0

参考代码

  1. package com.robot.scalademo


  2. object _08ObjectDemo {

  3. def dvi(a:Double, b:Double) = {

  4. if(b != 0) {

  5. Some(a / b)

  6. }

  7. else {

  8. None

  9. }

  10. }


  11. def main(args: Array[String]): Unit = {

  12. val result = dvi(1, 0).getOrElse(0)


  13. println(result) //0

  14. }}

1.偏函数的使用

1.scala中偏函数的定义

  • 偏函数被包在花括号内没有match的一组case语句是一个偏函数

  • 偏函数是PartialFunction[A, B]的一个实例,有两个参数

    • A代表输入参数类型

    • B代表返回结果类型

2.示例说明

案例1

定义一个偏函数,根据以下方式返回

参考代码

  1. // func1是一个输入参数为Int类型,返回值为String类型的偏函数

  2. val func1: PartialFunction[Int, String] = {

  3. case 1 => "一"

  4. case 2 => "二"

  5. case 3 => "三"

  6. case _ => "其他"

  7. }


  8. println(func1(2)) //一

案例2

  • 定义一个列表,包含1-10的数字

  • 请将1-3的数字都转换为[1-3]

  • 请将4-8的数字都转换为[4-8]

  • 将其他的数字转换为(8-*]

参考代码

  1. val list = (1 to 10).toList


  2. val list2 = list.map{

  3. case x if x >= 1 && x <= 3 => "[1-3]"

  4. case x if x >= 4 && x <= 8 => "[4-8]"

  5. case x if x > 8 => "(8-*]"

  6. }


  7. println(list2)

  8. //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

参考代码

  1. package com.robot.scalademo


  2. object _08ObjectDemo {


  3. def main(args: Array[String]): Unit = {

  4. val r = """.+@.+\..+""".r //1.构造一个RegEx对象,调用字符串的.r方法即可。


  5. val eml1 = "qq12344@163.com"

  6. val eml2 = "qq12344@.com"


  7. if (r.findAllMatchIn(eml1).size > 0) { //2.使用findAllMatchIn方法可以获取到所有正则匹配到的字符串

  8. println(eml1 + "邮箱合法")

  9. }

  10. else {

  11. println(eml1 + "邮箱不合法")

  12. }


  13. if (r.findAllMatchIn(eml2).size > 0) {

  14. println(eml2 + "邮箱合法")

  15. }

  16. else {

  17. println(eml2 + "邮箱不合法")

  18. }

  19. }

  20. }


  21. /***

  22. *qq12344@163.com邮箱合法

  23. qq12344@.com邮箱不合法

  24. */

示例2:找出以下列表中的所有不合法的邮箱

  1. object _08ObjectDemo {


  2. def main(args: Array[String]): Unit = {

  3. val emlList =

  4. List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")


  5. val regex = """.+@.+\..+""".r


  6. val invalidEmlList = emlList.filter {

  7. x =>

  8. if (regex.findAllMatchIn(x).size < 1) true else false

  9. }


  10. println(invalidEmlList)

  11. }

  12. }

  13. /***

  14. List(123afadff.com)

  15. */

示例3:

  • 有以下邮箱列表

      "38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com"Copy
  • 使用正则表达式进行模式匹配,匹配出来邮箱运营商的名字。例如:邮箱zhansan@163.com,需要将163匹配出来

    • 使用括号来匹配分组

  • 打印匹配到的邮箱以及运营商

    1. package com.robot.scalademo


    2. object _08ObjectDemo {


    3. def main(args: Array[String]): Unit = {

    4. val regex = """.+@(.+)\..+""".r


    5. val emlList =

    6. List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")


    7. val emlCmpList = emlList.map {

    8. case x@regex(company) => s"${x} => ${company}"

    9. case x => x + "=>未知"

    10. }


    11. println(emlCmpList)

    12. }

    13. }

    14. /***

    15. List(38123845@qq.com => qq, a1da88123f@gmail.com => gmail, zhansan@163.com => 163, 123afadff.com=>未知)

    16. */

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108448265

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。