详解Scala模式匹配

模式匹配是Scala中非常有特色,非常强大的一种功能。模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理,下面为大家讲解一下Scala模式匹配具体使用方法。

简单匹配

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

val colorNum = 1
val colorStr = colorNum match {
   case 1 => "red"
   case 2 => "green"
   case 3 => "yellow"
   case _ => "Not Allowed"
}
println(colorStr)

为了测试上面代码,可以直接把上面代码放入到“/usr/local/scala/mycode/test.scala”文件中,然后,在Linux系统的Shell命令提示符状态下执行下面命令:

scala test.scala

Shell 命令

另外,在模式匹配的case语句中,还可以使用变量。

val colorNum = 4
val colorStr = colorNum match {
   case 1 => "red"
   case 2 => "green"
   case 3 => "yellow"
   case unexpected => unexpected + " is Not Allowed"  
}
println(colorStr)

按照前面给出的方法,在test.scala文件中测试执行上述代码后会在屏幕上输出:

4 is Not Allowed

也就是说,当colorNum=4时,值4会被传递给unexpected变量。

类型模式

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

for (elem "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)     } 

在test.scala文件中测试执行上述代码后会在屏幕上输出:

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)”语句

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

for (elem case _ if (elem %2 == 0) => println(elem + " is even.")
           case _ => println(elem + " is odd.")
   }
}

上面代码中if后面条件表达式的圆括号可以不要。执行上述代码后可以得到以下输出结果:

1 is odd.
2 is even.
3 is odd.
4 is even.

for表达式中的模式

我们之前在介绍“映射”的时候,实际上就已经接触过了for表达式中的模式。 还是以我们之前举过的映射为例子,我们创建的映射如下:

val university = Map("XMU" -> "Xiamen University""THU" -> "Tsinghua University","PKU"->"Peking University")

循环遍历映射的基本格式是:

for ((k,v) 

对于遍历过程得到的每个值,都会被绑定到k和v两个变量上,也就是说,映射中的“键”被绑定到变量k上,映射中的“值”被绑定到变量v上。

下面给出此前已经介绍过的实例:

for ((k,v) printf("Code is : %s and name is: %s\n",k,v)

上面代码执行结果如下:

Code is : XMU and name is: Xiamen University
Code is : THU and name is: Tsinghua University
Code is : PKU and name is: Peking University

case类的匹配

case类是一种特殊的类,它们经过优化以被用于模式匹配。

case class Car(brand: String, price: Int)
val myBYDCar = new Car("BYD", 89000)
val myBMWCar = new Car("BMW", 1200000)
val myBenzCar = new Car("Benz", 1500000)
for (car case Car("BYD", 89000) => println("Hello, BYD!")
       case Car("BMW", 1200000) => println("Hello, BMW!")
       case Car(brand, price) => println("Brand:"+ brand +", Price:"+price+", do you want it?")        
   }
}

把上述代码放入test.scala文件中,运行“scala test.scala”命令执行后可以得到如下结果:

Hello, BYD!
Hello, BMW!
Brand: Benz, Price:1500000, do you want it?

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")res0: Option[Int] = Some(5) //下面我们从映射中取出键为"hive"对应的值,这个键是不存在的,所以取到的值是None对象scala> books.get("hive")res1: Option[Int] = None

scala

Option类型还提供了getOrElse方法,这个方法在这个Option是Some的实例时返回对应的值,而在是None的实例时返回传入的参数。例如:

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

scala

可以看出,当我们采用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)

scala

可以发现,上述代码执行后,屏幕上什么都没有显示,因为,foreach遍历遇到None的时候,什么也不做,自然不会执行println操作。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/221657.html<

(0)
管理的头像管理
上一篇2025-04-15 03:28
下一篇 2025-04-15 03:29

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注