1類型自動(dòng)匹配(模式匹配)
為豐縣等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及豐縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、豐縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!2函數(shù)是有值的(匿名函數(shù)是函數(shù)的常態(tài))
遞歸函數(shù)需要指定返回值
3.內(nèi)部類隸屬于外部類的實(shí)例本身,而java內(nèi)部類屬于外部類,對(duì)外部類的依賴路徑依賴
4.object類似于java中的靜態(tài)內(nèi)部類 里面的所有成員都是靜態(tài)的,適用于配置文件
靜態(tài)都是用來(lái)修飾類的內(nèi)部成員的。比如靜態(tài)方法、靜態(tài)成員變量。它唯一的作用就是隨著類的加載(而不是隨著對(duì)象的產(chǎn)生)而產(chǎn)生,以致可以用類名+靜態(tài)成員名直接獲得。這樣靜態(tài)內(nèi)部類就可以理解了,它可以直接被用 外部類名+內(nèi)部類名 獲得。
5.同名object是class的伴生對(duì)象,很多時(shí)候伴生對(duì)象是做為伴生類靜態(tài)成員的封裝區(qū)域
6.scala方法的最后一行是返回值無(wú)return
7.scala可變參數(shù)Int* java中 int... args
8.apply使用與單例
http://book.51cto.com/art/201408/449448.htm
9.接口trait(可以有非抽象方法)比 interface (只能有抽象方法) 功能強(qiáng)大很多 extends ..... with....with....
跟java一樣只能繼承一個(gè)trait或者class,如果還要繼承其他trait需要with(對(duì)象混入)
10. 包對(duì)象(package object) 包中所有類可以直接訪問(wèn)包對(duì)象的所有成員和方法
11scala包的隱式引用
import java.lang._
import scala._
import Predef._
12.映射符號(hào) => lambda表達(dá)式,表示一個(gè)匿名函數(shù)
13.占位符 _ placeholder 模式匹配代表字符串
14. 本地函數(shù) 在函數(shù)中定義的函數(shù),內(nèi)部函數(shù)屬于私有函數(shù),外部不可以訪問(wèn),實(shí)現(xiàn)高內(nèi)聚低耦合
15.偏函數(shù) _ 代表參數(shù) 編譯器根據(jù)sum _ (空格+下劃線)自動(dòng)產(chǎn)生類里的apply方法 傳遞部分參數(shù)變成另外一種函數(shù)
16.閉包 javascript支持 閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),由于javascript的語(yǔ)言特性,如果你想讀取一個(gè)函數(shù)內(nèi)部的變量,那你本身也必須是這個(gè)函數(shù)內(nèi)部子函數(shù)。
17.高階函數(shù) map() 以函數(shù)作為參數(shù)
18.模式匹配與提取器 Extrator
match
case
case
模式匹配在具體數(shù)據(jù)類型的上的應(yīng)用
19.正則表達(dá)式后面帶個(gè).r
20.Scala的case class和pattern matching(模式匹配),這倆個(gè)兩個(gè)程序結(jié)構(gòu)對(duì)于處理樹結(jié)構(gòu)的數(shù)據(jù)非常有幫助。Scala的case class使得對(duì)對(duì)象進(jìn)行模式匹配變得非常方便,簡(jiǎn)單的來(lái)說(shuō),Scala的case class就是在普通的類定義前加case這個(gè)關(guān)鍵字,然后你可以對(duì)這些類來(lái)模式匹配。
成員默認(rèn)是val的,成員未顯式聲明var或者val的話,默認(rèn)是val(常量)
每個(gè)case class都會(huì)有伴生對(duì)象里面有apply方法
伴生對(duì)象會(huì)幫我們構(gòu)造出case class的具體對(duì)對(duì)象
unapply從已經(jīng)構(gòu)建出的對(duì)象中(case class or object)提取出內(nèi)容,而伴生對(duì)象的apply方法是構(gòu)建對(duì)象
21 構(gòu)造器的函數(shù)名為this,重載構(gòu)造器(附屬構(gòu)造器)必須要調(diào)用其他的附屬構(gòu)造器,其他的構(gòu)造器在最終形態(tài)上會(huì)調(diào)用主構(gòu)造器,scala函數(shù)若沒(méi)有參數(shù)省略小括號(hào),this()可以簡(jiǎn)寫成this
22. 別名 @符號(hào)可以引用匹配到的對(duì)象 index@"Flink"
23 sealed封閉 只能在當(dāng)前文件里頭被繼承,限制子類必須在同一個(gè)文件中
Option 的兩個(gè)子類 Some None
24.兩個(gè)::表示往List頭部添加元素,三個(gè):::組合List,List集合分為head(第一個(gè))和tail兩部分
val hadoop= new Hadoop ::Nil
25.拉鏈操作 zip
26.flatMap 集合map后合并多個(gè)集合
27.List更多操作 partition(分區(qū)) span find(第一個(gè)滿足條件的元素) takeWhile dropWhile
exists (有一個(gè)滿足返回true) forall (全部滿足返回true)
28.foldLeft foldRight從最左邊開始和最右邊開始 sortwith(_<_)排序操作
29. List.range(2,5) 半閉半開區(qū)間 List(2,3,4)不包括5
30.List.map2同時(shí)對(duì)兩個(gè)集合相應(yīng)元素操作
31.可變集合需要引入mutable包,默認(rèn)是不可變的集合
可變集合可以直接用+=和-=追加刪除元素,++=和--=追加刪除集合
32.HashMap非常高效的,對(duì)key進(jìn)行hashcode取值
33.treeMap,treeSet有序的
34.List[+A]協(xié)變
35. <- 提取符號(hào)(迭代器)
37. f 代表函數(shù)
38. Bounds 類型限定符號(hào)
< : 上界 只能是子類
> : 下界 只能是父類
更常用 < % 視圖界定 不是子類會(huì)隱式轉(zhuǎn)換 Int ->RichInt String->RichString
39. Ordered[T]對(duì)象可以用>或者<符號(hào)比較對(duì)象代替Comparable[T]的comapreTo方法
40. [T : Ordering] context bounds 上下文界定 存在一個(gè)類型為Ordering[T]的隱式值
spark大量使用
41. [T : Manifest] 內(nèi)部自動(dòng)構(gòu)建Manifest類型的隱式參數(shù) implicit
[T : ClassTag] 編譯時(shí)會(huì)自動(dòng)翻譯成隱式參數(shù)和隱式值
虛擬機(jī)運(yùn)行時(shí)泛型是擦除的,不認(rèn)識(shí)泛型 ,必須給具體的類型
42. 理解即可 類型約束 A < : < B A必須是B的子類比< :更嚴(yán)格,編譯的時(shí)候就會(huì)去判斷類型
A=:=B A和B是同類型
43. [+A] covariance(協(xié)變) [-A] contravariance(逆變)
如果一個(gè)類型支持協(xié)變或逆變,則稱這個(gè)類型為variance(翻譯為可變的或變型),否則稱為invariant(不可變的)
先說(shuō)說(shuō)協(xié)變和逆變(實(shí)際上還有非變)。協(xié)變和逆變主要是用來(lái)解決參數(shù)化類型的泛化問(wèn)題。由于參數(shù)化類型的參數(shù)(參數(shù)類型)是可變的,當(dāng)兩個(gè)參數(shù)化類型的參數(shù)是繼承關(guān)系(可泛化),那被參數(shù)化的類型是否也可以泛化呢?Java中這種情況下是不可泛化的,然而Scala提供了三個(gè)選擇,即協(xié)變、逆變和非變。下
面說(shuō)一下三種情況的含義,首先假設(shè)有參數(shù)化特征Queue,那它可以有如下三種定義。
1)trait Queue[T] {}
這是非變情況。這種情況下,當(dāng)類型S是類型A的子類型,則Queue[S]不可認(rèn)為是Queue[A]的子類型或父類型,這種情況是和Java一樣的。
2)trait Queue[+T] {}
這是協(xié)變情況。這種情況下,當(dāng)類型S是類型A的子類型,則Queue[S]也可以認(rèn)為是Queue[A}的子類型,即Queue[S]可以泛化為Queue[A]。也就是被參數(shù)化類型的泛化方向與參數(shù)類型的方向是一致的,所以稱為協(xié)變。
3)trait Queue[-T] {}
這是逆變情況。這種情況下,當(dāng)類型S是類型A的子類型,則Queue[A]反過(guò)來(lái)可以認(rèn)為是Queue[S}的子類型。也就是被參數(shù)化類型的泛化方向與參數(shù)類型的方向是相反的,所以稱為逆變。
44. 默認(rèn)情況下只要方法(函數(shù))是泛型的,它的參數(shù)是逆變的,返回值就是協(xié)變的
Scala規(guī)定,協(xié)變類型只能作為方法的返回類型,而逆變類型只能作為方法的參數(shù)類型。類比函數(shù)的行為,結(jié)合Liskov替換原則,就能發(fā)現(xiàn)這樣的規(guī)定是非常合理的。
里氏替換原則(Liskov Substitution Principle LSP)
里氏替換原則是面向?qū)ο笤O(shè)計(jì)的基本原則之一。任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。LSP是繼承復(fù)用的基石,只有當(dāng)子類可以替換基類,軟件單位的功能不受影響時(shí),基類才能真正的被復(fù)用,而子類也可以在基類的基礎(chǔ)上增加新的行為。
里氏替換原則通俗的來(lái)講就是:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。它包含以下4層含義:
子類可以實(shí)現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
當(dāng)子類的方法重載父類的方法時(shí),方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類更嚴(yán)格。
參考文章:
http://www.tuicool.com/articles/vaAnmq
45.this.type表示當(dāng)前對(duì)象(this)的類型,this指代當(dāng)前的對(duì)象。this.type被用于變量,函數(shù)參數(shù)和函數(shù)返回值的類型聲明,主要是在某些場(chǎng)合下加強(qiáng)類型約束,或者說(shuō)是為了確保類型的絕對(duì)安全,鏈?zhǔn)秸{(diào)用
46. type相當(dāng)于起個(gè)別名
47. spark很少使用 結(jié)構(gòu)類型 不想從類或者接口的角度限制它, 傳入的參數(shù)包含某種方法
48. 復(fù)合類型(extend ....with ....with.... )與結(jié)構(gòu)類型結(jié)合使用
49.infix type (中置類型) 中置表達(dá)式(右結(jié)合) :> 代表函數(shù)名 中置類型:類型名稱寫在兩個(gè)參數(shù)中間,泛型的實(shí)例在類型的兩側(cè)
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實(shí)例指針起別名 內(nèi)部類引用非常方便 this:S1 =>自身類型實(shí)例約束必須混入S1
51.鴨子模型與動(dòng)態(tài)語(yǔ)言 不關(guān)注類型而關(guān)注方法與屬性
52.type抽象類型 與 類型參數(shù)(語(yǔ)法比較復(fù)雜)
type In=String
53.隱式轉(zhuǎn)換總結(jié):查找范圍為作用域或者伴生對(duì)象
我們需要某個(gè)類中特殊方法,但是這個(gè)類沒(méi)有提供這樣一個(gè)方法,所以我們需要隱式轉(zhuǎn)換成提供了這個(gè)方法的類,然后在調(diào)用這個(gè)方法
需要一個(gè)增強(qiáng)類,RichInt,RichFile
隱式轉(zhuǎn)換函數(shù) implicit def
54.隱式參數(shù):有個(gè)隱式default值
參數(shù)顆?;?/p>
55.隱式類implicit class
56.隱式對(duì)象 implicit object
57.伴生對(duì)象隱式轉(zhuǎn)換不需要import
58.并發(fā)繼承Actor編程(Akka分布式并發(fā)消息驅(qū)動(dòng)框架) 覆寫def act(){ }
59.actor工具方法創(chuàng)建匿名Actor
!發(fā)消息
receive中代碼塊轉(zhuǎn)換成偏函數(shù),說(shuō)他是偏函數(shù)因?yàn)榉祷氐挠?jì)算結(jié)果有很多類型
60. 主線程當(dāng)作Actor使用 self.receive{} main主線程接受其他線給主線程發(fā)送的消息
self.receiveWithin() 指定超時(shí)時(shí)間不會(huì)一直阻塞
sender ! 給發(fā)送者返回消息
線程之間使用case class或者class object傳遞消息
61. react loop 線程重用 替代while(true) { recieve { } }的方式
62.scala swing編程覆寫top方法
63. listenTo(button) deafTo(button) 監(jiān)聽(tīng)和解除監(jiān)聽(tīng)
事件棧
reactions +={
case ButtonClicked(button)=>{
}
}
64.for循環(huán)中的模式匹配
for其實(shí)調(diào)用的是foreach
for((k,v:Int) <-List(("spark"->5),("Hadoop"->"Big Data"))) { println(k)}
65.模式匹配中不能用大寫字母,大寫字母會(huì)被認(rèn)為是常量
模式匹配編譯器是lazy級(jí)別的,不會(huì)報(bào)錯(cuò),運(yùn)行會(huì)報(bào)錯(cuò)
66.getClass實(shí)例 classOf 類型本身
classOf [ ] 更高級(jí)別 typeOf[ ]更詳細(xì)級(jí)別
67.所有的對(duì)象都有一個(gè)唯一的.type的單例類型
this.type構(gòu)成了鏈?zhǔn)奖磉_(dá)式返回的是動(dòng)態(tài)當(dāng)前實(shí)際運(yùn)行的實(shí)例
68.List的兩個(gè)子類 class ::和object Nil(空)
69.外在的函數(shù)式和內(nèi)部的可變性是非常精妙的組合
70.for表達(dá)式的生成器、定義器、過(guò)濾器
71.play框架
72.for循環(huán)取代map,flatmap,filter
73.akka的Actor是樹狀結(jié)構(gòu)( 分層)的共享一些公共信息
actor有路徑 akka://HelloAkka/user/master
子Actor路徑
akka://HelloAkka/user/master/map
akka://HelloAkka/user/master/reduce
74.SBT專為scala設(shè)計(jì)的構(gòu)建工程 交互式命令操作 安裝SBT插件
75.事件驅(qū)動(dòng)的編程模型 消息郵箱
preStart postStop preReStart
ActorSystem ActorRef(actor的引用)
創(chuàng)建actor的過(guò)程伴隨actor的啟動(dòng),創(chuàng)建完可以直接發(fā)消息
76.Actor的構(gòu)造器 默認(rèn)的 傳入類名 非默認(rèn)的傳入其他actor從而發(fā)消息
77. akka中消息的發(fā)送方式 (都是異步的)
1.Fire and Forget 不等待對(duì)方返回結(jié)果 java:tell,scala:!
2.Send and Receive java:ask scala:? future
主線程也屬于一個(gè)actor 在/temp路徑下
78.deadletters 消息接受actor死亡
forward轉(zhuǎn)發(fā)會(huì)攜帶原始sender
79.停止Actor
shutdown()停止ActorSystem
master!PoisonPill (藥丸) 異步的
master!kill 同步的
context.stop(self) 異步的
80.monitoring Actor
watch unwatch
81.動(dòng)態(tài)切換actor的處理邏輯
become unbecome
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。