前面两节我们已经多次接触过case关键字了。case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类。不过用case修饰的类也主要是用来做模式匹配。在上一节曾经提到过match可以是Any类型的所有类,为什么还需要使用case关键字来修饰呢?假定有这样一个场景:我们要接收和处理股票交易信息,买卖消息通常会带有一些信息,诸如股票名称、数量。把这些信息存到对象里会很方便,但是如何对他们进行模式匹配呢?这时我们就会用到case类了。case类是模式匹配器(pattern matcher)可以识别和匹配的类。

下面是一个例子:

abstract class Trade()

case class Sell(stockSymbol: String, quantity: Int) extends Trade

case class Buy(stockSymbol: String, quantity: Int) extends Trade

case class Hedge(stockSymbol: String, quantity: Int) extends Trade

class TradeProcessor {
def processTransaction(request: Trade) {
request match {
case Sell(stock, 1000) => println("Selling 1000-units of " + stock)
case Sell(stock, quantity) => printf("Selling %d units of %s\n", quantity, stock)
case Buy(stock, quantity) if (quantity > 2000) => printf("Buying %d (large) units of %s\n", quantity, stock)
case Buy(stock, quantity) => printf("Buying %d units of %s\n", quantity, stock)
}
}
}

这里,用request匹配Sell和Buy。如果接收到的股票代码和数量得到匹配,就会分别存储到模式变量stock和quantity里。这里还用到特定常量值(比如quantity为1000)或是卫述句(比如检查if quantity > 2000)进行匹配。

此时我们已经为Trade类准备了三个实现,我们并不需要其它的实现,更不希望其他人再实现这个trait。此时,我们可以使用sealed关键字来限制只能在当前文件下实现这个trait。就像这样:

sealed abstract class Trade()

case class Sell(stockSymbol: String, quantity: Int) extends Trade

case class Buy(stockSymbol: String, quantity: Int) extends Trade

case class Hedge(stockSymbol: String, quantity: Int) extends Trade

在上面的代码中,Trade的所有实现case类都有参数。当一个case类没有参数时,记得在使用的时候一定要加上括号,不然传递的不再是这个类的实例,而是它的伴生对象。这个伴生对象混入了scala.Function0 trait,这意味着它可以当作函数用。所以,最终传入的是一个函数,而不是case类的实例。

#################

最新文章

  1. HAproxy的安装与配置讲解
  2. SQL Server 变更数据捕获(CDC)
  3. Java随笔四---Java异常
  4. Bootstrap IIFE
  5. LINUX 硬盘命令
  6. 【C#】 装箱 (boxing) 和拆箱 (unboxing)
  7. AHOI2009最小割
  8. 一分钟让你明白CSS中的盒模型
  9. ES6 对象的扩展(上)
  10. drupal 8 建立我的相册
  11. Dynamics CRM2015 Update1 新功能之表单增强功能
  12. linxu上安装mongodb3.6实战
  13. Hibernate入门(五)---------事务管理
  14. Web大前端面试题-Day12
  15. Django model中的Class Meta
  16. 电子邮件 -- 图解TCP_IP_第5版
  17. delphi如何检索adoquery里面某一列存在的重复行?
  18. 【BIRT】在页面上展示xxxx年xx月xx日
  19. PAT——1040. 有几个PAT
  20. Java动态代理代码快速上手

热门文章

  1. 机械迷城MAC下载及攻略
  2. 淘宝订单数据转CSV
  3. Spring使用JMS传递消息的两种方式
  4. BaseAction 类
  5. 通过文件对照工具Merge数据库
  6. 003-spring结合java类调用quartz
  7. redis实现cache系统原理(五)
  8. 吴超老师课程---Hadoop的伪分布安装
  9. Python(文件处理)
  10. 关于maven包冲突的一些思路