[Scala]学习笔记


大数据学院_腾讯大数据
http://data.qq.com/academy
Spark是一个通用的并行计算框架,立足于内存技术,从迭代计算出发,兼收交互式查询,流处理和图计算等多种计算模式,已经成为大数据领域最活跃的开源项目之一。腾讯大数据和华为共同在深圳举办Spark技术交流论坛,邀请业内专家一起探讨交流。 点击播放 >>


Scala学习笔记 - jethai的博客 - 博客频道 - CSDN.NET
http://blog.csdn.net/jethai/article/details/52345267

1类型自动匹配(模式匹配)
2函数是有值的(匿名函数是函数的常态)
递归函数需要指定返回值
3.内部类隶属于外部类的实例本身,而java内部类属于外部类,对外部类的依赖路径依赖
4.object类似于java中的静态内部类 里面的所有成员都是静态的,适用于配置文件
静态都是用来修饰类的内部成员的。比如静态方法、静态成员变量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得。

5.同名object是class的伴生对象,很多时候伴生对象是做为伴生类静态成员的封装区域
6.scala方法的最后一行是返回值无return
7.scala可变参数Int* java中 int... args
8.apply使用与单例
http://book.51cto.com/art/201408/449448.htm
9.接口trait(可以有非抽象方法)比 interface (只能有抽象方法) 功能强大很多 extends ..... with....with....
跟java一样只能继承一个trait或者class,如果还要继承其他trait需要with(对象混入)

  1. 包对象(package object) 包中所有类可以直接访问包对象的所有成员和方法
    11scala包的隐式引用
    import java.lang._
    import scala._
    import Predef._
    12.映射符号 => lambda表达式,表示一个匿名函数
    13.占位符 _ placeholder 模式匹配代表字符串
  2. 本地函数 在函数中定义的函数,内部函数属于私有函数,外部不可以访问,实现高内聚低耦合
    15.偏函数 _ 代表参数 编译器根据sum _ (空格+下划线)自动产生类里的apply方法 传递部分参数变成另外一种函数
    16.闭包 javascript支持 闭包就是能够读取其他函数内部变量的函数,由于javascript的语言特性,如果你想读取一个函数内部的变量,那你本身也必须是这个函数内部子函数。
    17.高阶函数 map() 以函数作为参数

18.模式匹配提取器 Extrator
match
case
case
模式匹配在具体数据类型的上的应用

19.正则表达式后面带个.r
20.Scala的case class和pattern matching(模式匹配),这俩个两个程序结构对于处理树结构的数据非常有帮助。Scala的case class使得对对象进行模式匹配变得非常方便,简单的来说,Scala的case class就是在普通的类定义前加case这个关键字,然后你可以对这些类来模式匹配。
成员默认是val的,成员未显式声明var或者val的话,默认是val(常量)
**每个case class都会有伴生对象里面有apply方法 **
伴生对象会帮我们构造出case class的具体对对象****


unapply从已经构建出的对象中(case class or object)提取出内容,而伴生对象的apply方法是构建对象


21 构造器的函数名为this,重载构造器(附属构造器)必须要调用其他的附属构造器,其他的构造器在最终形态上会调用主构造器,scala函数若没有参数省略小括号,this()可以简写成this

  1. 别名 @符号可以引用匹配到的对象 index@"Flink"
    23 sealed封闭 只能在当前文件里头被继承,限制子类必须在同一个文件中
    Option 的两个子类 Some None
    24.两个::表示往List头部添加元素,三个:::组合List,List集合分为head(第一个)和tail两部分
    val hadoop= new Hadoop ::Nil

25.拉链操作 zip
26.flatMap 集合map后合并多个集合
27.List更多操作 partition(分区) span find(第一个满足条件的元素) takeWhile dropWhile

exists (有一个满足返回true) forall (全部满足返回true)
28.foldLeft foldRight从最左边开始和最右边开始 sortwith(<)排序操作

  1. List.range(2,5) 半闭半开区间 List(2,3,4)不包括5
    30.List.map2同时对两个集合相应元素操作
    31.可变集合需要引入mutable包,默认是不可变的集合
    可变集合可以直接用+=和-=追加删除元素,++=和--=追加删除集合
    32.HashMap非常高效的,对key进行hashcode取值
    33.treeMap,treeSet有序的
    34.List[+A]协变

  2. <- 提取符号(迭代器)

  3. f 代表函数

  4. Bounds 类型限定符号
    < : 上界 只能是子类
    > : 下界 只能是父类
    更常用 < % 视图界定 不是子类会隐式转换 Int ->RichInt String->RichString

  5. Ordered[T]对象可以用>或者<符号比较对象代替Comparable[T]的comapreTo方法

  6. [T : Ordering] context bounds 上下文界定 存在一个类型为Ordering[T]的隐式值
    spark大量使用

  7. [T : Manifest] 内部自动构建Manifest类型的隐式参数 implicit
    [T : ClassTag] 编译时会自动翻译成隐式参数和隐式值
    虚拟机运行时泛型是擦除的,不认识泛型 ,必须给具体的类型

  8. 理解即可 类型约束 A < : < B A必须是B的子类比< :更严格,编译的时候就会去判断类型
    A=:=B A和B是同类型

  9. [+A] covariance(协变) [-A]** contravariance(逆变)**
    如果一个类型支持协变或逆变,则称这个类型为variance(翻译为可变的或变型),否则称为invariant(不可变的)
    先说说协变和逆变(实际上还有非变)。协变和逆变主要是用来解决参数化类型的泛化问题。由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢?Java中这种情况下是不可泛化的,然而Scala提供了三个选择,即协变、逆变和非变。下 面说一下三种情况的含义,首先假设有参数化特征Queue,那它可以有如下三种定义。 1)trait Queue[T] {} 这是非变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]不可认为是Queue[A]的子类型或父类型,这种情况是和Java一样的。 2)trait Queue[+T] {} 这是协变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]也可以认为是Queue[A}的子类型,即Queue[S]可以泛化为Queue[A]。也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。 3)trait Queue[-T] {} 这是逆变情况。这种情况下,当类型S是类型A的子类型,则Queue[A]反过来可以认为是Queue[S}的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变。

44. 默认情况下只要方法(函数)是泛型的,它的参数是逆变的,返回值就是协变的
Scala规定,协变类型只能作为方法的返回类型,而逆变类型只能作为方法的参数类型。类比函数的行为,结合Liskov替换原则,就能发现这样的规定是非常合理的。
里氏替换原则(****Liskov Substitution Principle LSP****)


  里氏替换原则是面向对象设计的基本原则之一。任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当子类可以替换基类,软件单位的功能不受影响时,基类才能真正的被复用,而子类也可以在基类的基础上增加新的行为。

    里氏替换原则通俗的来讲就是:**子类可以扩展父类的功能,但不能改变父类原有的功能。**它包含以下4层含义:

子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

子类中可以增加自己特有的方法。

当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

参考文章:
http://www.tuicool.com/articles/vaAnmq

45.this.type表示当前对象(this)的类型,this指代当前的对象。this.type被用于变量,函数参数和函数返回值的类型声明,主要是在某些场合下加强类型约束,或者说是为了确保类型的绝对安全,链式调用

  1. type相当于起个别名****
  2. spark很少使用 结构类型 不想从类或者接口的角度限制它, 传入的参数包含某种方法
  3. 复合类型(extend ....with ....with.... )与结构类型结合使用
    49.infix type (中置类型) 中置表达式(右结合) :> 代表函数名 中置类型:类型名称写在两个参数中间,泛型的实例在类型的两侧

[java] view plain copy

object :> {
def unapply[A] (list: List[A]) = {
Some( (list.init, list.last) )
}
}

object Extractor_Advanced {

def main(args: Array[String]) {
(1 to 9).toList match{ case _ :> 9 => println("Hadoop") }
(1 to 9).toList match{ case x :> 8 :> 9 => println("Spark") }
(1 to 9).toList match{ case :>(:>(_,8),9) => println("Flink") }

}

}

50.self type 自身类型 self => 给this实例指针起别名 内部类引用非常方便 this:S1 =>自身类型实例约束必须混入S1

51.鸭子模型与动态语言 不关注类型而关注方法与属性
52.type抽象类型 与 类型参数(语法比较复杂)
type In=String
53.隐式转换总结查找范围为作用域或者伴生对象
我们需要某个类中特殊方法,但是这个类没有提供这样一个方法,所以我们需要隐式转换成提供了这个方法的类,然后在调用这个方法
需要一个增强类,RichInt,RichFile
隐式转换函数 implicit def
54.隐式参数:有个隐式default值
参数颗粒化
55.隐式类implicit class
56.隐式对象 implicit object
57.伴生对象隐式转换不需要import
58.并发继承Actor编程(Akka分布式并发消息驱动框架) 覆写def act(){ }
59.actor工具方法创建匿名Actor
!发消息
receive中代码块转换成偏函数,说他是偏函数因为返回的计算结果有很多类型

  1. 主线程当作Actor使用 self.receive{} main主线程接受其他线给主线程发送的消息
    self.receiveWithin() 指定超时时间不会一直阻塞
    sender ! 给发送者返回消息
    线程之间使用case class或者class object传递消息
  2. react loop 线程重用 替代while(true) { recieve { } }的方式
    62.scala swing编程覆写top方法
  3. listenTo(button) deafTo(button) 监听和解除监听
    事件栈
    reactions +={
    case ButtonClicked(button)=>{
    }
    }
    64.for循环中的模式匹配
    for其实调用的是foreach
    for((k,v:Int) <-List(("spark"->5),("Hadoop"->"Big Data"))) { println(k)}
    65.模式匹配中不能用大写字母,大写字母会被认为是常量
    ** 模式匹配编译器是lazy级别的,不会报错,运行会报错**
    66.getClass实例 classOf 类型本身
    classOf [ ] 更高级别 typeOf[ ]更详细级别
    67.所有的对象都有一个唯一的.type的单例类型
    ** this.type构成了链式表达式返回的是动态当前实际运行的实例**
    68.List的两个子类 class ::和object Nil(空)
    69.外在的函数式和内部的可变性是非常精妙的组合
    70.for表达式的生成器、定义器、过滤器
    71.play框架
    72.for循环取代map,flatmap,filter
    73.akka的Actor是树状结构( 分层)的共享一些公共信息
    actor有路径 akka://HelloAkka/user/master
    子Actor路径
    akka://HelloAkka/user/master/map
    akka://HelloAkka/user/master/reduce
    74.SBT专为scala设计的构建工程 交互式命令操作 安装SBT插件
    75.事件驱动的编程模型 消息邮箱
    preStart postStop preReStart
    ActorSystem ActorRef(actor的引用)
    创建actor的过程伴随actor的启动,创建完可以直接发消息
    76.Actor的构造器 默认的 传入类名 非默认的传入其他actor从而发消息
  4. akka中消息的发送方式 (都是异步的)
    1.Fire and Forget 不等待对方返回结果 java:tell,scala:!
    2.Send and Receive java:ask scala:? future
    主线程也属于一个actor 在/temp路径下
    78.deadletters 消息接受actor死亡
    forward转发会携带原始sender
    79.停止Actor
    shutdown()停止ActorSystem
    master!PoisonPill (药丸) 异步的
    master!kill 同步的
    context.stop(self) 异步的
    80.monitoring Actor
    watch unwatch
    81.动态切换actor的处理逻辑
    become unbecome
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容