zoukankan      html  css  js  c++  java
  • Scala_模式匹配

    模式匹配

    简单匹配

    • Scala的模式匹配最常用于match语句中。下面是一个简单的整型值的匹配实例

    object TestMatch {
     def main(args: Array[String]): Unit = {
       val colorNum = 3
       val colorStr = colorNum match {
         case 1 => "red"
         case 2 => "green"
         case 3 => "yellow"
         case _ => "Not Allowed"
      }
       print(colorStr)
    }
    }
    // 执行结果
    yellow
    • 另外,在模式匹配的case语句中,还可以使用变量。

    object TestMatch {
     def main(args: Array[String]): Unit = {
       val colorNum = 55
       val colorStr = colorNum match {
         case 1 => "red"
         case 2 => "green"
         case 3 => "yellow"
         case unexpected => unexpected + " is Not Allowed"
      }
       print(colorStr)
    }
    }
    // 执行结果
    55 is Not Allowed

    类型模式

    • Scala可以对表达式的类型进行匹配

    object TestMatch {
     def main(args: Array[String]): Unit = {
       for (elem <- List(9,12.3,"spark","Hadoop",'hello)){
         val str = elem match {
           case i: Int => i + " is an int value"
           case d: Double => d + " is a double value."
           case "spark" => "spark is found"
           case s: String => s + " is a string value"
           case _ => "This is an unexpected value"
        }
         println(str)
      }
    }
    }
    // 执行结果
    9 is an int value
    12.3 is a double value.
    spark is found
    Hadoop is a string value
    This is an unexpected value

    “守卫(guard)”语句

    • 可以在模式匹配中添加一些必要的处理逻辑

    object TestMatch {
     def main(args: Array[String]): Unit = {
       for (elem <- List(1,2,3,4)){
         elem match {
           case _ if (elem % 2 == 0) => println(elem + " is even.")
           case _ => println(elem + " is odd.")
        }
      }
    }
    }
    // 执行结果
    1 is odd.
    2 is even.
    3 is odd.
    4 is even.

    for表达式中的模式

    • 格式

    for ((k , v) <- 映射) 语句块
    scala> val university2 = Map("XMU" -> "Xiamen University","THU" -> "Tsinghua University")
    scala> for ((k,v) <- university2) printf("Code is : %s and name is : %s " , k , v)
    Code is : XMU and name is : xiamen university
    Code is : THU and name is : Tsinghua University

    case类的匹配

    Option类型

    • 标准类库中的Option类型用case类来表示那种可能存在、也可能不存 在的值

    • 一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引 用的是“无”,在Java中使用的是null。Scala融合了函数式编程风格, 因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建 议你使用Option类型

    • Option类包含一个子类Some,当存在可以被引用的值的时候,就可以使用Some来包含这个值,例如Some("Hadoop")。而None则被声明 为一个对象,而不是一个类,表示没有值

    scala> val books = Map("hadoop" -> 5,"spark" -> 10,"hbase" -> 7)
    books: scala.collection.immutable.Map[String,Int] = Map(hadoop -> 5, spark -> 10, hbase -> 7)
    // 下面我们从映射中取出健为Hadoop对应的值,这个建存在的,可以取到值,并且取到的会被包含在some中返回
    scala> books.get("hadoop")
    res4: Option[Int] = Some(5)
    scala> books.get("hive")
    res5: Option[Int] = None
    • Option类型还提供了getOrElse方法,这个方法在这个Option是Some的实例时 返回对应的值,而在是None的实例时返回传入的参数。例如:

    scala> val sales = books.get("hive")
    sales: Option[Int] = None
    scala> sales.getOrElse("No Such Book")
    res7: Any = No Such Book
    scala> println(sales.getOrElse("No Such Book"))
    No Such Book

    scala> val sales = books.get("hbase")
    sales: Option[Int] = Some(7)
    scala> println(sales.getOrElse("No Such Book"))
    7
    • 可以看出,当我们采用getOrElse方法时,如果我们取的"hive"没有对应的值, 我们就可以显示我们指定的“No Such Book”,而不是显示None。

    • 在Scala中,使用Option的情形是非常频繁的。在Scala里,经常会用到 Option[T]类型,其中的T可以是Sting或Int或其他各种数据类型。 Option[T]实际上就是一个容器,我们可以把它看做是一个集合,只不过这个集 合中要么只包含一个元素(被包装在Some中返回),要么就不存在元素(返 回None)。

    • 既然是一个集合,我们当然可以对它使用map、foreach或者filter等方法。比如:

    scala> books.get("hive").foreach(println)
    • 可以发现,上述代码执行后,屏幕上什么都没有显示,因为,foreach遍历遇到 None的时候,什么也不做,自然不会执行println操作

  • 相关阅读:
    asp.net core 中TagHelper使用
    vs2015 添加命令提示工具
    关于MVC中Start.cs文件的作用
    Sql Server的两个小技巧
    用vue.js重构订单计算页面
    用vue.js实现购物车功能
    一步步实现自己的ORM(五)
    一步步实现自己的ORM(四)
    将Object转换成Dictionary方法
    一步步实现自己的ORM(三)
  • 原文地址:https://www.cnblogs.com/zxbdboke/p/10466319.html
Copyright © 2011-2022 走看看