scala高级内容(一) Case Class
一. 操作符
自定义操作符
操作付默认左结合调用.除了以:结尾的操作符是右结合调用
object OperaterTest extends App{
val a: myInt = new myInt(1)
val b: myInt = new myInt(2)
val c: myInt = new myInt(3) println(a +++ b)
println((c---:b---:a).value) //:结尾的操作符右结合,相当于(a.---:(b)).---:(c) = 1-2-3 } class myInt(val value:Int){
def +++(a:myInt):Int = { // 定义操作符 +++
a.value + value // 要使a.value能够访问,主构造器的字段要生命成val.使getter,setter方法为public
} // 操作符默认左结合,除了以:结尾的操作符使o结合的右.比如::
def ---:(a:myInt):myInt = {
new myInt(this.value - a.value)
}
}
二.apply,update,ubapply去名调用
apply(param)方法
(1)apply对象通常声明在半生对象中,用来构造对象
(2)cala把apply()方法的调用简化成了(param)update(param)方法
update()方法的调用,简化成了(param)=object Test extends App{
val scores = new mutable.HashMap[String,Int]
scores("Bob") = 100 // update
println(scores("Bob")) // apply
}
unapply方法
(1)当用未初始化的变量放在一个类()里,和等式右侧的对象进行匹配时,则这些未初始化的变量调用该类的unapply方法进行初始化
(2)unapply()方法返回的结果使Option[元祖]类型的,要么是None,要么是Some[T]object CaseClassTest extends App{
val Name(first,scend,third) = "haha hehe lala"; // first,second,third必须是未声明的变量
println(first)
println(scend)
println(third)
} object Name{
def unapply(input:String) :Option[(String,String,String)] = { //元祖:不同类型的值的集合
if(input.indexOf(" ") == -1)
None
else
Some(input.split(" ")(0),input.split(" ")(1),input.split(" ")(2))
}
}
unapplySeq方法
(1)unapply用来提取固定个数的变量,来给未知变量赋值.若要提取出不定长度的变量,用unapplySeq方法
(2)unapplySeq与unapply不能同事存在,否则模式匹配时,只会调用unapply进行匹配object CaseClassTest extends App{
val Name(first,scend,third) = "haha hehe lala"; // first,second,third必须是未声明的变量
println(first)
println(scend)
println(third) val str = "asd sdf gh sdf"
str match {
case Name(a,b,c) => println("3 param:"+a+","+b+","+c)
case Name(a,b,c,d) => println("4 param:"+a+","+b+","+c+","+d)
}
} object Name{ def unapplySeq(input:String):Option[Seq[String]] ={
if(input.indexOf(" ") == -1)
None
else
Some(input.split(" "))
}
}
三. Case Class
什么事样例类:经过scala编译器优化后,被更好的用于模式匹配规则的类
(1)Case class的每个参数默认以val(不变形式)存在,除非显式的声明为var
(2)自动产生伴生对象,、且半生对象中自动产生appay方法来构建对象
(3)半生对象自动产生unapply方法,提取主构造器的参数进行模式匹配
(4)自动产生copy方法,来构建一个与现有值相同的新对象
(5)class中自动产生hashcode,toString,equals方法object CaseClassTest extends App{
val currency:Money = RMB(12.3,"yuan")
//多态下,子类的模式匹配
currency match {
case Dollar(x:Double) => println("dollar:"+x)
case RMB(x:Double,y:String) => println("rmb:"+x+y) //rmb:12.3yuan
} val currency2 = RMB(23.4,"yuan")
println(currency2.copy(value=12.1)) //RMB(12.1,yuan) =>自动产生的toString } abstract class Money
case class Dollar(value:Double) extends Money
case class RMB(value:Double,danwei:String) extends Money
匹配循环嵌套的样例类
(1)循环嵌套的样例类:一个case class的对象中,包含另一个case class的对象实例
(2)因为对象存在循环嵌套,则需要使用递归处理对象,切该对象要有别名,用于递归处理。name @ patternobject CaseClassTest extends App{
val bundle:Item = Bundle("Father's day special",20.0, // 这个对象包含2个Item,1个是artice,另一个是包含两个artice的Bundle
Article("scala for impatient",39.3),
Bundle("other lanugage",10.0,Article("thinking in java",79.5),Article("c++ progeamme",65.4))) def price(it:Item):Double= it match {
case Article(_,price) => price
case Bundle(_,disc,items @ _*) => items.map(price(_)).sum - disc
} println(price(bundle))
} abstract class Item
case class Article(description:String,price:Double) extends Item
case class Bundle(description:String,discount:Double,iterms:Item*) extends Item
case class的密封
(1)当case class的超类使用关键字sealed修饰,则编译器会校验对该超类对象的模式匹配规则中,是否列出了全部可能的子case类
(2)且该超类的子类只能出现在超类的文件中,形成封闭,而不能出现在其他文件中
scala高级内容(一) Case Class的更多相关文章
- scala高级内容(二) - Implicit
一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...
- SQL Server高级内容之case语法函数
1.Case函数的用法 (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...
- Scala进阶之路-Scala高级语法之隐式(implicit)详解
Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...
- Lucene的查询及高级内容
Lucene查询 基本查询: @Test public void baseQuery() throws Exception { //1. 创建查询的核心对象 FSDirectory d = FSDir ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- scala 高级编程
一.函数式编程 Scala中的函数可以独立存在, 不需要依赖任 何类和对象 def 放在类中就是方法:放在外边就是函数 1.将函数赋值给变量 Scala中的函数是一等公民, 可以独立定义, 独立存在 ...
- scala语言中的case关键字在spark中的一个奇特使用
package com.spark.demo import com.spark.demo.util.SparkUtil import org.apache.spark.rdd.RDD import s ...
- Scala高级语法
一.隐式 implicit分类: (1)隐式参数 (2)隐式转换类型 (3)隐式类 特点:让代码变得更加灵活 (一)隐式参数 1.ImplicitTest object ImplicitTest { ...
- scala学习手记40 - case表达式里的模式变量和常量
再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...
随机推荐
- html5的特性
1.简化的语法更简单的doctype声明是HTML5里众多新特征之一.现在你只需要写,这就行了.HTML5的语法兼容HTML4和XHTML1,但不兼容SGML. 2. 一个替代Flash的新”canv ...
- Maven项目中找不到maven dependencies library
一般是,workspace中的.classpath文件中有内容丢失造成 在 <classpathentry kind="con" path="org.eclipse ...
- MySQL复制的基本概念和实现
MySQL的复制的概念是完成水平扩展的架构 MySQL性能方面的扩展方式有scale on(向上扩展,垂直扩展) scale out(向外扩展,水平扩 ...
- 20145220《Java程序设计》实验一实验报告
*实验一 Java开发环境的熟悉 实验内容及步骤 使用JDK编译.运行简单的Java程序 命令行下程序开发: 在命令行下建立实验目录,进入该目录后创建exp1目录 敲入以下代码: package ex ...
- spark新能优化之序列化的持久化级别
除了对多次使用的RDD进行持久化操作之外,还可以进一步优化其性能.因为很有可能,RDD的数据是持久化到内存,或者磁盘中的.那么,此时,如果内存大小不是特别充足,完全可以使用序列化的持久化级别,比如ME ...
- PHP的一些要点
1.用户评论的内容应当使用htmlspecialchars()函数进行过滤,如htmlspecialchars($_POST['content']);再写入数据库,防止用户评论中含有JS和HTML代码 ...
- windows日常软件推荐
下面的软件都是本人实际使用过的. 我只是推荐,没逼着你用,也没收谁的钱做广告. 操作系统win7 64bits. 不定期更新. [QQ轻聊版] 本人就是一个码畜,上班族,天气好坏都得挤地铁去上班,也没 ...
- 安装了iis之后,打开默认网站http://localhost/要求输入用户名和密码解决办法
开始-运行gpedit.msc回车. 计算机配置--管理模板-windows 组件-Internet Exporer-Internet控制面板-安全页-Internet区域:双击登陆选 ...
- *** 安全沙箱冲突 *** 到 127.0.0.1:9999 的连接已停止 - 不允许从 file:///E:/flash/Flash/Vod/tag/Letvcloud__MainVodNew/bin-debug/Player.swf 进行连接
http://bbs.9ria.com/thread-69309-1-1.html C:\Windows\System32\Macromed\Flash\NPSWF64_21_0_0_242.dll ...
- glibc下的内存管理
在解码过程中我们也遇到了类似的问题,第一次解码的音频比较大60s,耗了3G的内存,reset之后内存并没有退还给操作系统,第二次即使解一个10s的音频 几周前我曾提到,我被项目组分配去做了一些探究li ...