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

目录

0. Option类型

0.1示例演示

1.偏函数的使用

1.scala中偏函数的定义

2.示例说明

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

2.1 语法格式

2.2示例说明


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=>未知)
      */
    

     

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页