- 浏览: 596078 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
样本类(case clas)和模式匹配(pattern matching),在编写规范的、无封装数据结构时会用到的构件。对于树型递归数据尤其有用。
一、简单例子:
样本类:添加了case的类便是样本类。这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定。如下:
添加与类名一致的工厂方法。也就是说,可以写成Var("x")来构造Var对象。
样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护。
编译器为这个类添加了方法toString,hashCode和equals等方法。
模式匹配:
match对应Java里的switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。
一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
match表达式通过以代码编写的先后次序尝试每个模式来完成计算。类似于UnOp("-" , UnOp("-" , e))这种形式的,是构造器模式匹配。
match与switch的比较:匹配表达式可以被看作Java风格Switch的泛化。
但有三点不同:
1.match是Scala的表达式,始终以值作为结果;
2.Scala的备选项表达式永远不会“掉到”下一个case;
3.如果没有模式匹配,MatchError异常会被抛出。这意味着必须始终确信所有的情况都考虑到了,或者至少添加一个默认情况什么都不做。如 case _ =>
二、模式的种类
通配模式:case _ => 。表示默认的全匹配备选项。通配模式还可以用来忽略对象中不关心的部分。如:case BinOp(_,_,_) => XXX,则表示不关心二元操作符的元素是什么,只是检查是否为二元操作符
常量模式 :仅匹配自身。任何字面量都可以用作常量。包括String类型。另外,任何的val或单例对象也可以被用作常量。如,单例对象Nil是只匹配空列表的模式。
变量模式 :变量模式类似于通配符,可以匹配任何对象。不同点在于,Scala把变量绑定在匹配的对象上。之后就可以使用这个变量操作对象。如:
有一个注意点:Scala使用了一个简单的文字规则来区分是一个常量还是一个变量:用小写字母开始的简单名被当作是模式变量。
构造器模式:它的存在使得模式匹配真正变得强大。它由名称及若干括号之内的模式构成。如BinOp("+" , e , Number(0))。
序列模式:可以像匹配样本类那样匹配List或Array这样的序列类型。同样的语法现在可以指定模式内任意数量的元素。如:
如果想匹配一个不指定长度的序列,可以指定_*作为模式的最后元素。它能匹配序列中0到任意数量的元素。
元组模式:
类型模式:可以把它当做类型测试和类型转换的简易替代。例如:
使用:
另:在Scala里类型测试和转换的代码很冗长,因为不建议这么做。
模式守卫:模式变量仅允许在模式中出现一次。如:
1 case BinOp("+" , x , x ) => BinOp("*" , x , Number(2))
这种写法就会出错。可以改成: case BinOp("+" , x , y ) if x == y => BinOp("*" , x , Number(2))
模式守卫接在模式之后,开始于if。守卫可以是任意的引用模式中变量的布尔表达式。如果存在模式守卫,那么只有在守卫返回true的时候匹配才成功。
一、简单例子:
abstract class Expr case class Var(name:String) extends Expr case class Number(num:Double) extends Expr case class UnOp(operator : String , arg : Expr) extends Expr case class BinOp(operator : String , left : Expr , right : Expr) extends Expr
样本类:添加了case的类便是样本类。这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定。如下:
添加与类名一致的工厂方法。也就是说,可以写成Var("x")来构造Var对象。
样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护。
编译器为这个类添加了方法toString,hashCode和equals等方法。
模式匹配:
def simplifyTop(expr : Expr) : Expr = expr match{ case UnOp("-" , UnOp("-" , e)) => e case BinOp("+" , e , Number(0)) => e case BinOp("*" , e , Number(1)) => e case _ => expr }
match对应Java里的switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。
一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
match表达式通过以代码编写的先后次序尝试每个模式来完成计算。类似于UnOp("-" , UnOp("-" , e))这种形式的,是构造器模式匹配。
match与switch的比较:匹配表达式可以被看作Java风格Switch的泛化。
但有三点不同:
1.match是Scala的表达式,始终以值作为结果;
2.Scala的备选项表达式永远不会“掉到”下一个case;
3.如果没有模式匹配,MatchError异常会被抛出。这意味着必须始终确信所有的情况都考虑到了,或者至少添加一个默认情况什么都不做。如 case _ =>
二、模式的种类
通配模式:case _ => 。表示默认的全匹配备选项。通配模式还可以用来忽略对象中不关心的部分。如:case BinOp(_,_,_) => XXX,则表示不关心二元操作符的元素是什么,只是检查是否为二元操作符
常量模式 :仅匹配自身。任何字面量都可以用作常量。包括String类型。另外,任何的val或单例对象也可以被用作常量。如,单例对象Nil是只匹配空列表的模式。
变量模式 :变量模式类似于通配符,可以匹配任何对象。不同点在于,Scala把变量绑定在匹配的对象上。之后就可以使用这个变量操作对象。如:
expr match{ case 0 => "zero" case somethingElse => "not zero" + somethingElse }
有一个注意点:Scala使用了一个简单的文字规则来区分是一个常量还是一个变量:用小写字母开始的简单名被当作是模式变量。
构造器模式:它的存在使得模式匹配真正变得强大。它由名称及若干括号之内的模式构成。如BinOp("+" , e , Number(0))。
序列模式:可以像匹配样本类那样匹配List或Array这样的序列类型。同样的语法现在可以指定模式内任意数量的元素。如:
expr match{ case List(0 , _ , _ ) => println("found it") case _ => }
如果想匹配一个不指定长度的序列,可以指定_*作为模式的最后元素。它能匹配序列中0到任意数量的元素。
元组模式:
def tupleDemo(expr : Any) = expr match { case (a , b, c) => println("matched " + a + b + c) case _ => }
类型模式:可以把它当做类型测试和类型转换的简易替代。例如:
def generalSize(x : Any) = x match{ case s : String => s.length case m : Map[_ , _] => m.size case _ => 1 }
使用:
scala> generalSize(Map(1 -> 'a' , 2 -> 'b')) res15 : Int = 2
另:在Scala里类型测试和转换的代码很冗长,因为不建议这么做。
模式守卫:模式变量仅允许在模式中出现一次。如:
1 case BinOp("+" , x , x ) => BinOp("*" , x , Number(2))
这种写法就会出错。可以改成: case BinOp("+" , x , y ) if x == y => BinOp("*" , x , Number(2))
模式守卫接在模式之后,开始于if。守卫可以是任意的引用模式中变量的布尔表达式。如果存在模式守卫,那么只有在守卫返回true的时候匹配才成功。
发表评论
文章已被作者锁定,不允许评论。
-
Scala 在Intellij中搭建Scala环境(jdk8,scala2.11.4)
2017-06-02 16:33 14361.打开Intellij然后点击File->Plugin ... -
Scala Partial Functions(偏函数)学习
2017-04-24 10:54 342如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子 ... -
Scala 作业题练习纪录
2017-04-20 14:39 10011.用reduceLeft获取集合中最大元素 println ... -
Scala 闭包理解
2017-04-20 13:57 660闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 ... -
Scala 各种符号的含义(->,:::,::,<-,=>)
2017-04-20 09:50 645:::运算符 :::(三个冒号)表示List的连接操作,比如: ... -
Scala filter方法过滤集合元素(获取集合中的元素)
2017-04-19 14:44 2063Problem 你想要筛选出集合中的一些元素形成一个新的集合 ... -
Scala apply方法学习(类和对象都存在apply方法)
2017-04-19 10:18 730Scala比Java更面向对象的一个方面是Scala没有静态成 ... -
Scala Map(映射)学习
2017-04-18 09:20 429Map(映射)是一种可迭代的键值对(key/value)结构。 ... -
Scala 元组Tuple学习
2017-04-17 16:12 634元组是Scala提供的一种 ... -
Scala 函数之map(返回集合)、reduce、flatMap、zip和foreach(无返回值)学习
2017-04-17 15:04 2217map和flatMap的区别 object collect ... -
Scala 符号 => 的用法(匿名函数(x:Int)=>x+1)
2017-04-17 10:58 6961. 表示函数的类型(Function Type) de ... -
Scala 下划线(_)的多种应用场景学习
2017-04-13 20:00 5831、作为“通配符”,类似Java中的*。如import sca ... -
Scala mkString方法(把一个集合转化为一个字符串)
2017-04-13 19:34 1203Problem 如果你想要把集合元素转化为字符串,可能还会添加 ... -
Scala yield案例 (for 循环和 yield 的例子)
2017-04-13 18:42 623下面是摘自 《Programming in Scala》关于 ... -
Scala 基本概念学习
2017-04-13 14:40 534Type Inference类型推断 当你声明的任何变量时,你 ...
相关推荐
在Scala中,Case Class是一种特殊的类,它被设计用于模式匹配和数据封装。其特点包括: 1. **自动成员访问**:Case Class的成员默认是公开的,可以直接通过`.`操作符访问。 2. **隐式拷贝功能**:创建Case Class...
本文将详细介绍 Scala 语言 for 循环中的六种模式匹配方式:变量模式匹配、常量模式匹配、变量绑定模式匹配、类型模式匹配、构造函数模式匹配和序列模式匹配。 变量模式匹配 在 Scala 语言中,变量模式匹配是最...
Scala 正则表达式是 Scala 语言中的一种强大工具,用于模式匹配和字符串处理。在 Scala 中,正则表达式可以通过两种方式创建:通过 `r` 方法直接将字符串转换成正则表达式对象,或者直接显式地调用 `Regex` 构造函数...
例如,函数`abs(x: Int)`使用模式匹配和条件守卫来判断一个整数是否为正数或负数,并返回其绝对值。 ```scala def abs(x: Int) = x match { case i: Int if i >= 0 => i case j: Int if j < 0 => -j case _ => ...
1. **案例类(Case Classes)**:这是Scala中一种特殊的类,主要用于模式匹配。它们自动实现了`equals`和`hashCode`方法,以及`toString`方法,非常适合用作模式匹配中的模式。 2. **提取器(Extractors)**:在...
Scala作为一种兼具面向对象和函数式编程特性的现代语言,通过一系列高级语言特性(如模式匹配、类型推断等)使得许多设计模式的实现更加简洁高效。 #### 二、Scala中的设计模式 接下来,我们将具体介绍几种在Scala...
运行时代码生成和评估可以在scala.tools.reflect.ToolBox完成,但是每个包只能创建一个类(请参见此)。 因此,现在我正在使用和生成案例类的字节码,并使用自定义类加载器加载新创建的类。 动态生成的类可用于在...
模式匹配和 Java 的 `switch` 语句类似,但更加强大,因为它可以处理更复杂的结构,而且是一个表达式,总是返回一个值。`@unchecked` 注解用于抑制未覆盖模式的检查,防止 `MatchError` 异常。 总的来说,样例类和...
在Scala中,样例类(Case Class)是一种特殊类型的类,主要用于模式匹配和不可变数据结构的构建。它们提供了许多便利的功能,如自动实现`equals`、`hashCode`、`toString`等方法,简化了开发者的编码工作量。 #### ...
例如,`case class`用于创建模式匹配友好的数据结构,而`trait`则提供了接口和混入(mix-in)多重继承的功能。此外,`Option`类型是Scala处理null安全的一种方式,它强制程序员明确处理空值情况,避免了常见的...
清单2展示了如何使用Scala的`case`类配合模式匹配来处理颜色。`case`类是一种特殊的轻量级类,它们自动提供`equals()`、`hashCode()`以及模式匹配支持。在这个例子中,我们定义了一个基本的`Color`类,以及三个继承...
例如,可以根据不同条件匹配和执行不同的操作。 综上所述,Scala中的正则表达式及其与模式匹配的结合,为字符串处理提供了一种强大而灵活的工具。无论是在简单的文本解析还是在复杂的模式匹配场景中,Scala都提供了...
3. **模式匹配**:Scala的模式匹配允许你根据值的不同形式执行不同的操作,这是其强大之处,尤其在处理数据解析和case类时。 **进阶篇** 4. **函数式编程**:Scala深受函数式编程的影响,如高阶函数、闭包、柯里化...
例如,"Objects and Classes" 部分将会讲解类的定义、单例对象、伴生对象(companion objects)、case类以及模式匹配等概念。 4. 特质(Traits):特质在Scala中扮演着极其重要的角色,它们可以被看作是包含方法和...
通过以上几种设计模式的例子可以看出,Scala支持各种面向对象和函数式的设计模式,这些模式有助于编写更高质量、更灵活、更容易维护的代码。在实际开发中,根据项目的具体需求选择合适的设计模式是非常重要的。
Scala模式匹配.md
"示例,或者可能包含一些更复杂的案例,如函数定义、类和对象的创建、集合操作、模式匹配的使用,甚至是Actor系统的简单实现。通过研究这些源代码,你可以更好地理解和掌握Scala语言的核心概念。 总的来说,Scala是...
4. **case class 和 class 类的区别**: - `case class` 提供了自动的 equals, hashCode, copy, toString 等方法,通常用于数据传输对象(DTO)。 - `class` 没有这些便利,需要手动实现上述功能。 5. **unapply ...
此外,你还将了解Scala的模式匹配和异常处理机制,这些都是Scala编程的基础。 "Scala进阶之路-part02-集合.pdf"将带你深入了解Scala的集合库,它是Scala语言的一大亮点。这部分会讲解如何使用List、Set、Map等集合...
8. **模式匹配**:Scala的模式匹配不仅限于枚举类型,还可以用于解构类和集合,以及在case类和case对象上使用。这是一种强大的代码简化和错误检测工具。 9. **DSL(Domain Specific Language)**:Scala的语法特性...