scala中的模式匹配和样例类

目录

模式匹配

模式匹配中的守卫和变量

对象模式匹配

数组模式匹配

 列表模式匹配

元组模式匹配

样例类(cass class)

匹配嵌套结构

Option的使用

偏函数


模式匹配

模式匹配是scala中的另一个特色,比java中的swich case语句强大的多,不仅能够对值进行匹配,还可以对类型、集合元素进行匹配。

match case的语法如下:变量 match { case 值 => 代码 }。如果值为下划线,则代表了不满足以上所有情况下的默认情况如何处理。此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。(与Java不同,java的switch case需要用break阻止)

模式匹配中的守卫和变量

scala中有守卫这么一个概念,就是对原本的条件,进行二次过滤,在之前的scala条件控制和循环 中已经提到过守卫这个概念了。模式匹配中同样可以在值后面再加一个if守卫,进行双重过滤。

如果case关键字后面跟着一个变量名,那么匹配的表达式会赋值给这个变量,并且在本条case中可以使用这个变量,“_”可以看做此特性的一种特殊表现形式。

下面介绍一下scala模式匹配的强大用法

对象模式匹配

对类型如何进行匹配?其他语法与匹配值其实是一样的,但是匹配类型的话,就是要用“case 变量: 类型 => 代码”这种语法,而不是匹配值的“case 值 => 代码”这种语法。

数组模式匹配

对Array进行模式匹配,分别可以匹配带有指定元素的数组、带有指定个数元素的数组、以某元素打头的数组

 列表模式匹配

对List进行模式匹配,与Array类似,但是需要使用List特有的::操作符

元组模式匹配

样例类(cass class)

scala中提供了一种特殊的类,用case class进行声明,中文也可以称作样例类。case class其实有点类似于Java中的JavaBean的概念。即只定义field,并且由Scala编译时自动提供getter和setter方法,但是没有method。

case class的主构造函数接收的参数通常不需要使用var或val修饰,Scala自动就会使用val修饰(但是如果你自己使用var修饰,那么还是会按照var来)。

scala自动为case class定义了伴生对象,也就是object,并且定义了apply()方法,该方法接收主构造函数中相同的参数,并返回case class对象。

我们可以使用copy方法创建一个与现有对象值相同的新对象

虽然这样做没什么意义,因为Student是不可变的,我们完全可以共享这个对象引用,但是我们可以使用带名参数与copy方法结合修改某些属性

匹配嵌套结构

有些场景下,样例类被用于嵌套结构,内部嵌套多个继承同样超类的样例类。例如:超市捆绑销售

我们也可以用@表示的方法,把嵌套的值绑定到变量上

Option的使用

Scala有一种特殊的类型,叫做Option。Option有两种值,一种是Some,表示有值,一种是None,表示没有值。

Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了,也更加安全。

Option支持泛型,比如Some("liumingxin")的类型为Option[String]。

Map的get方法返回的就是一个Option,如果没有对应的值,分会None

下面做个例子:

这样写太繁琐了,我就是要判断个值是否存在,你让我写这么多,这个忍不了。下面来用更简单的方式使用Option

偏函数

偏函数(PartialFunction)是被花括号包含在内的一组case语句,一个并非对所有输入值都有定义的函数。它时PartialFunction[A,B]类的一个实例(A代表参数类型,B代表输出类型)。该类又两个方法,apply方法从匹配到的模式中计算函数值;isDefinedAt方法在输入至少匹配一个模式时返回true。

偏函数表达式必须位于可以推断出返回类型的上下文中。当你把它赋值给一个带有类型声明的变量,或者将它作为参数传递时,都符合要求。

猜你喜欢

转载自blog.csdn.net/lazy_moon/article/details/82177134