一. 操作符

  1. 自定义操作符

  2. 操作付默认左结合调用.除了以:结尾的操作符是右结合调用

    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去名调用

  1. apply(param)方法

    (1)apply对象通常声明在半生对象中,用来构造对象

    (2)cala把apply()方法的调用简化成了(param)

  2. update(param)方法

    update()方法的调用,简化成了(param)=

    object Test extends App{
    val scores = new mutable.HashMap[String,Int]
    scores("Bob") = 100 // update
    println(scores("Bob")) // apply
    }
  3. 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))
    }
    }
  4. 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

  1. 什么事样例类:经过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
  2. 匹配循环嵌套的样例类

    (1)循环嵌套的样例类:一个case class的对象中,包含另一个case class的对象实例

    (2)因为对象存在循环嵌套,则需要使用递归处理对象,切该对象要有别名,用于递归处理。name @ pattern

    object 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
  3. case class的密封

    (1)当case class的超类使用关键字sealed修饰,则编译器会校验对该超类对象的模式匹配规则中,是否列出了全部可能的子case类

    (2)且该超类的子类只能出现在超类的文件中,形成封闭,而不能出现在其他文件中

scala高级内容(一) Case Class的更多相关文章

  1. scala高级内容(二) - Implicit

    一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...

  2. SQL Server高级内容之case语法函数

    1.Case函数的用法  (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...

  3. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  4. Lucene的查询及高级内容

    Lucene查询 基本查询: @Test public void baseQuery() throws Exception { //1. 创建查询的核心对象 FSDirectory d = FSDir ...

  5. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  6. scala 高级编程

    一.函数式编程 Scala中的函数可以独立存在, 不需要依赖任 何类和对象 def  放在类中就是方法:放在外边就是函数 1.将函数赋值给变量 Scala中的函数是一等公民, 可以独立定义, 独立存在 ...

  7. scala语言中的case关键字在spark中的一个奇特使用

    package com.spark.demo import com.spark.demo.util.SparkUtil import org.apache.spark.rdd.RDD import s ...

  8. Scala高级语法

    一.隐式 implicit分类: (1)隐式参数 (2)隐式转换类型 (3)隐式类 特点:让代码变得更加灵活 (一)隐式参数 1.ImplicitTest object ImplicitTest { ...

  9. scala学习手记40 - case表达式里的模式变量和常量

    再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...

随机推荐

  1. sgu259 Printed PR    贪心

    link:http://acm.sgu.ru/problem.php?contest=0&problem=259 思路就是贪心. 首先要读懂题目,输入的方式,把样例读懂. 第一,打印的总时间一 ...

  2. c#部分---用函数的四种格式做一元二次方程

    格式一:(无参无返) public void fangcheng() { Console.WriteLine("请输入a的值"); double a = int.Parse(Con ...

  3. Performance Analysis Methodology

    http://www.brendangregg.com/methodology.html The USE Method: for finding resource bottlenecks The TS ...

  4. Nginx-/etc/sysctl.conf 参数解释

    来自<深入理解Nginx模块开发与架构解析> P9 #表示进程(例如一个worker进程)可能同时打开的最大句柄数,直接限制最大并发连接数 fs. #1代表允许将状态为TIME-WAIT状 ...

  5. Linux启动新进程的三种方法

    程序中,我们有时需要启动一个新的进程,来完成其他的工作.下面介绍了三种实现方法,以及这三种方法之间的区别. 1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进 ...

  6. SQL2005:使用varchar(max)代替text

    SQL Server 2005 联机丛书 中文相关说明 1.在 Microsoft SQL Server 的未来版本中将删除 ntext.text 和 image 数据类型.请避免在新开发工作中使用这 ...

  7. Asp.net MVC的actionlink到Areas里action

    <li>@Html.ActionLink("Home", "Index", "Home", new { area = " ...

  8. OpenJudge计算概论-整数奇偶排序

    /*===================================== 整数奇偶排序 总时间限制: 1000ms 内存限制: 65536kB 描述 输入10个整数,彼此以空格分隔 重新排序以后 ...

  9. SSDB

    一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ 开发 Re ...

  10. .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下   在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...