apply方法和unapply方法

appply方法

通常,在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字。

请看下面代码:

class Foo(foo:String){}object Foo{def apply(foo:String) : Foo = {new Foo(foo)}
}

定义一个Foo类,并且在这个类中,有一个伴生对象Foo,里面定义了apply方法。有了这个apply方法以后,在调用这个类的时候用函数的方式来调用:

object Client{def main(args:Array[String]):Unit = {val foo = Foo("hello")}
}

我们用Foo("hello")的方式,就得到了一个Foo类型的对象,这一切就是apply方法的功劳。如果没有apply方法,我们将需要使用new关键字来得到Foo对象。

unapply方法

可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象从中提取值。

请看下面的代码:

class Money(val value : Double, val country : String){}object Money{def apply(value : Double, country : String) : Money = new Money(value, country)def unapply(Money : Money) : Option[(Double, String)] = {if(money = null) None else Some(money.value, money.country)}
}

客户端实现:

def testUnapply  {val money = Money(10.1, "RMB")money match{case Money(num, "RMB") => println("RMB:" + num)case _ => println("Not RMB!")}
}
//最后输出
RMB:10.1

参考博文

http://blog.csdn.net/bitcarmanlee/article/details/76736252

apply方法和unapply方法相关推荐

  1. apply方法和call方法的详解2

    1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...

  2. angularJS学习小结——$apply方法和$watch方法

    引言 最近在项目中封装控件的时候用到了$watch方法来监听module中的值的变化,当时小编对这个方法不是很了 解,所以在网上找了一些资料来学习一下,下面小编就给大家简单介绍一些angularJS中 ...

  3. pandas中DataFrame的apply()方法和applymap()方法,以及python内置函数map()

    我们经常会对DataFrame对象中的某些行或列,或者对DataFrame对象中的所有元素进行某种运算或操作,我们无需利用低效笨拙的循环: import pandas as pd import num ...

  4. python 推迟运行_一文看懂Python的time模块sleep()方法和strftime()方法

    概述 今天主要介绍一下Python的time sleep()方法和strftime()方法. 一.Python time sleep()方法 Python time sleep() 函数推迟调用线程的 ...

  5. JS服务器端开发基础篇(Array.slice方法和splice方法)

    Array.slice方法和splice方法在众多的JS数组中属于比较复杂的一个方法,而且容易记混.搜索网络上很多资料都没有发现系统的总结.特别归纳如下,不完全处还希望各位批评指正.  一.slice ...

  6. Loader的load方法和loadBytes方法LoaderContext参数

    (1)在看代码的时候还发现一个以前没有这么注意的问题,也mark一下. 关于Loader的load方法和loadBytes方法LoaderContext参数的问题.. 要加载某个SWF到自己的安全域内 ...

  7. ThinkPHP 中M方法和D方法的具体区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  8. asp.net TemplateField模板中的Bind方法和Eval方法

    TemplateField模板中为了能够有限制的或者取出数据库中某列的值时,可以用Bind和Eval方法来实现.以下是Bind方法的格式,Eval的格式也是和Bind一样的. Bind("列 ...

  9. hashcode()方法和equals()方法

    一.hashcode()方法和equals()方法的介绍 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.eq ...

最新文章

  1. Linux常用命令--网终设置
  2. LeetCode Trips and Users(关联、分组,聚合)
  3. hbase shell 查看列名_hbase shell 命令行的操作
  4. Direct2D (11) : 画刷之 ID2D1LinearGradientBrush
  5. MNIST机器学习入门(学习记录)——1
  6. python打包exe 之打包sklearn模型中的各种坑及其解决方法。
  7. python归一化sklearn_用sklearn进行对数据标准化、归一化以及将数据还原详解
  8. LeetCode 70 爬楼梯
  9. 被坑了 | 那个写公众号,开网店的小小,被花式坑了!
  10. Java 开源博客 Solo 1.6.0 发布 - 新后台
  11. 又被腾讯刷屏!果然是印钞机.....酸哭了...
  12. 544B. Sea and Islands
  13. 《数据结构题集》2.12
  14. Effective Kotlin 中文版
  15. 数据库原理与应用(五)专门的关系运算
  16. Latex 1: 解决latex中遇到一个常见错误:Improper alphabetic constant.
  17. 直播答题狂撒币,这些“AI开挂神器”如何在10秒内算出正确答案?
  18. SequoiaDB巨杉数据库-JDBC驱动
  19. 开发人员实用的在线工具
  20. java编程源代码_java经典编程300例源代码下载

热门文章

  1. Centos7安装mysql 数据库
  2. 19 个强大、有趣、又好玩的 Linux 命令!
  3. 掌握18种特殊布线的画法与技巧,PCB设计无往不利!
  4. 大数据概念和Hadoop基本介绍
  5. 20175227张雪莹 2018-2019-2 《Java程序设计》第三周学习总结
  6. html消除行间距,HTML:如何从PRE标记中删除行间距
  7. 我用了10年,从深圳流水线工厂妹到纽约Google程序媛
  8. Matlab实现自相关矩阵,自相关矩阵的计算
  9. 企业管理软件ERP系统是什么?如何快速入手ERP系统?
  10. java 金额比较大小写_Java金额大小写的转换方法