zoukankan      html  css  js  c++  java
  • (数据科学学习手札49)Scala中的模式匹配

    一、简介

      Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍:

    二、Scala中的模式匹配

    2.1 基本格式

      Scala中模式匹配的基本格式如下:

      data match {

           case ... => 执行语句

           case ... => 执行语句

           case _  => 执行语句

    }

      其中,data表示将要进行模式匹配的对象,match是模式匹配的关键字,后面紧跟的{}中包含若干条匹配的方向,且只会匹配其中满足条件的第一条;对于每一条条件,都是以case关键字开头,紧跟匹配的模式,且_表示匹配任何模式,接着是=>,指向对应的执行语句,下面是一个简单的示例:

    object main{
      def main(args: Array[String]): Unit = {
        var data:String = "Hadoop"
        //模式匹配语句
        data match {
          case "Spark" => println("No!")
          case "Hadoop" => println("Yes")
        }
        var demo = 1 match {
            //通配符_表示匹配任何对象
          case _ => println("Anything!")
        }
      }
    }

      可以看出,在第一个模式匹配语句中,匹配到对应的"Hadoop"字符串对象之后,执行了对应的语句;在第二个模式匹配语句中,_指定了匹配任意对象,并执行了对应的输出;

    2.2 结合条件语句

      在我们的模式匹配语句中,可以添加条件语句,在Scala中这叫做守卫,下面是一个简单的例子:

    object main{
      def main(args: Array[String]): Unit = {
    
        def isMale(Gender:Int)={
          Gender match {
            case 1 => println("Yes!Male!")
            case 0 => println("No!Female!")
              //添加守卫的模式匹配语句
            case _ if Gender != 0 & Gender != 1 => println("Unknown!")
          }
        }
        //调用函数
        isMale(0)
        isMale(1)
        isMale(2)
      }
    }

     2.3 结合变量

      在Scala的模式匹配中,我们还可以在模式语句内直接赋以新变量,来与传入的变量结合起来,对上面的例子稍加改造得到下面这个例子:

    object main{
      def main(args: Array[String]): Unit = {
    
        def isMale(Gender:Int)={
          Gender match {
            case 1 => println("Yes!Male!")
            case 0 => println("No!Female!")
              //添加守卫的模式匹配语句
            case gender if gender != 0 & gender != 1 => {
              println("Unknown!")
              //在match语句中调用新变量
              println("gender = " + gender)
            }
          }
        }
        //调用函数
        isMale(2)
      }
    }

      可以看出,将match语句下的模式匹配内容由常量改成新变量,会直接将传入的待匹配对象传递给该新变量,但该新变量的作用域只限于match语句内,在外无法调用;

    2.4 匹配数组与元组

    数组:

      在对数组进行模式匹配时,可以配合通配符完成一些模糊匹配的功能:

    import scala.collection.mutable.ArrayBuffer
    
    object main{
      def main(args: Array[String]): Unit = {
    
        val Demo = ArrayBuffer("Spark","Scala","Python")
        Demo match {
          case ArrayBuffer("Scala") => println("No!")
          case ArrayBuffer("Spark",_*) => println("Yes!")
          case _ => println("Warning!")
        }
      }
    }

      通过在匹配内容中添加_*,来表示匹配任意多的数组元素,这这里表示匹配第一个元素时"Spark",之后任意多其他元素的可变长数组;

    元组:

      在匹配元组时,同样可以使用对应的语法来实现模糊匹配:

    object main{
      def main(args: Array[String]): Unit = {
        def fitTuple(tuple:Tuple2[Any,Any]): Unit ={
          tuple match {
            case (1,"Spark") => println("1")
              //匹配第二个元素为Scala的长度为2的元组
            case (x,"Scala") => println(x)
            case _ => println("Nothing!")
          }
        }
        val t = (3,"Scala")
        fitTuple(t)
      }
    }

     2.5 异常处理与模式匹配

      在前面的(数据科学学习手札45)Scala基础知识中提到过Scala中的错误处理机制,其实catch{}语句中的各条执行语句就是一条条的模式匹配语句,这里便不再赘述。

      以上就是Scala中关于模式匹配的一些基础内容的简单介绍,如有笔误,望指出。

  • 相关阅读:
    [Java5新特性]可变参数
    [Java5新特性]自动装箱/拆箱
    CentOS6.5下安装apache2.2和PHP 5.5.28
    VMware Workstation(虚拟机)v10.0.1 简体中文破解版
    [Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
    Android WebView与JavaScript交互操作(Demo)
    【CSS3 入门教程系列】CSS3 Media Queries 实现响应式设计
    Bootstrap 3支持IE 8遇到的一个小问题
    php文件大小单位转换GB MB KB
    2个比较经典的PHP加密解密函数分享
  • 原文地址:https://www.cnblogs.com/feffery/p/9562785.html
Copyright © 2011-2022 走看看