(数据科学学习手札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中关于模式匹配的一些基础内容的简单介绍,如有笔误,望指出。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人随笔

Java 使用面向对象开发

对象就是实际存在的一些东西 程序来源于生活 软件出现的目的: 用计算机的语言描述现实世界 用计算机解决现实世界的问题 面向对象设计和开发程序的好处: 交流更加流...

33470
来自专栏aCloudDeveloper

全排列(含递归和非递归的解法)

全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的。 用C++写一个函数, 如 Foo(const char *str), 打印出 s...

37690
来自专栏从零开始学自动化测试

python笔记2-冒泡排序

前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序。 一、基本原理 1.概念: 冒...

38760
来自专栏前端黑板报

一个数字截取引发的精度问题(三)

上次总结的第四条: 当传入的参数小于数字的整数位时,返回指数形式表示的字符串。 let numObj = 12345.6numObj.toPrecision(2...

20980
来自专栏CDA数据分析师

Python面试中8个必考问题

1、下面这段代码的输出结果是什么?请解释。 ? 怎样修改extendList的定义能够产生以下预期的行为? 上面代码输出结果将是: ? 很多人都会误认为list...

207100
来自专栏racaljk

[数据结构]对链表、栈、队列的总结

你应该发现了一些异常,为什么链表只有node的定义?再来细想一下这三种模型,我们会发现链表其实就是由节点组成的,而栈和队列我们把它视作一个容器,然后可以向里面放...

14430
来自专栏MyBlog

Effective.Java 读书笔记(4)非实例化

有时你想要编写一个类,这个类只是静态方法和静态域的组成,这样的一个类获得一个糟糕的名声因为一些人滥用他们为了避免对对象的术语进行思考,但是他们的确是有用的

9520
来自专栏北京马哥教育

grep命令及正则表达式

grep基本概念 grep:global search regular expression and print out the line. 作用:文本过滤器,...

37870
来自专栏十月梦想

ES6数组遍历之forEach,map和filter

在之前我们需要去循环数组,通常使用的是for循环,去循环数组的下标,而在ES6中提供了一种新的方式进行遍历数组!在看这个之前我们先对比一下之前的遍历方式!

5.6K20
来自专栏和蔼的张星的图像处理专栏

638. 字符同构哈希映射

给定两个字符串 s 和 t ,确定它们是否是同构的。 两个字符串是同构的如果 s 中的字符可以被替换得到 t。 所有出现的字符必须用另一个字符代替,同时保留...

8530

扫码关注云+社区

领取腾讯云代金券