天天看點

Scala學習筆記

1類型自動比對(模式比對)

2函數是有值的(匿名函數是函數的常态)

遞歸函數需要指定傳回值

3.内部類隸屬于外部類的執行個體本身,而java内部類屬于外部類,對外部類的依賴路徑依賴

4.object類似于java中的靜态内部類 裡面的所有成員都是靜态的,适用于配置檔案

靜态都是用來修飾類的内部成員的。比如靜态方法、靜态成員變量。它唯一的作用就是随着類的加載(而不是随着對象的産生)而産生,以緻可以用類名+靜态成員名直接獲得。這樣靜态内部類就可以了解了,它可以直接被用 外部類名+内部類名 獲得。

5.同名object是class的伴生對象,很多時候伴生對象是做為伴生類靜态成員的封裝區域

6.scala方法的最後一行是傳回值無return

7.scala可變參數int*  java中 int... args

8.apply使用與單例

<a href="http://book.51cto.com/art/201408/449448.htm" target="_blank">http://book.51cto.com/art/201408/449448.htm</a>

9.接口trait(可以有非抽象方法)比 interface (隻能有抽象方法) 功能強大很多  extends ..... with....with....

跟java一樣隻能繼承一個trait或者class,如果還要繼承其他trait需要with(對象混入)

10. 包對象(package object)  包中所有類可以直接通路包對象的所有成員和方法

11scala包的隐式引用

import java.lang._

import scala._

import predef._

12.映射符号 =&gt; lambda表達式,表示一個匿名函數

13.占位符  _  placeholder 模式比對代表字元串

14. 本地函數 在函數中定義的函數,内部函數屬于私有函數,外部不可以通路,實作高内聚低耦合

15.偏函數 _ 代表參數 編譯器根據sum _ (空格+下劃線)自動産生類裡的apply方法 傳遞部分參數變成另外一種函數

16.閉包 javascript支援 閉包就是能夠讀取其他函數内部變量的函數,由于javascript的語言特性,如果你想讀取一個函數内部的變量,那你本身也必須是這個函數内部子函數。

17.高階函數 map() 以函數作為參數

18.模式比對與提取器 extrator

                      match

                      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

22.  别名 @符号可以引用比對到的對象 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(_&lt;_)排序操作

29. list.range(2,5)   半閉半開區間  list(2,3,4)不包括5

30.list.map2同時對兩個集合相應元素操作

31.可變集合需要引入mutable包,預設是不可變的集合

可變集合可以直接用+=和-=追加删除元素,++=和--=追加删除集合

32.hashmap非常高效的,對key進行hashcode取值

33.treemap,treeset有序的

34.list[+a]協變

35. &lt;- 提取符号(疊代器)

37. f 代表函數

38. bounds 類型限定符号

                                         &lt; :  上界   隻能是子類

                                         &gt; :  下界   隻能是父類

              更常用             &lt; %  視圖界定 不是子類會隐式轉換  int -&gt;richint string-&gt;richstring

39.  ordered[t]對象可以用&gt;或者&lt;符号比較對象代替comparable[t]的comapreto方法

40. [t  : ordering] context bounds 上下文界定 存在一個類型為ordering[t]的隐式值

   spark大量使用

41. [t : manifest]  内部自動建構manifest類型的隐式參數 implicit

      [t : classtag]  編譯時會自動翻譯成隐式參數和隐式值

      虛拟機運作時泛型是擦除的,不認識泛型 ,必須給具體的類型

42. 了解即可 類型限制   a &lt; : &lt; b  a必須是b的子類比&lt; :更嚴格,編譯的時候就會去判斷類型

                       a=:=b  a和b是同類型  

43.    [+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層含義:

子類可以實作父類的抽象方法,但不能覆寫父類的非抽象方法。

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

當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。

當子類的方法實作父類的抽象方法時,方法的後置條件(即方法的傳回值)要比父類更嚴格。

參考文章:

<a href="http://www.tuicool.com/articles/vaanmq" target="_blank">http://www.tuicool.com/articles/vaanmq</a>

45.this.type表示目前對象(this)的類型,this指代目前的對象。this.type被用于變量,函數參數和函數傳回值的類型聲明,主要是在某些場合下加強類型限制,或者說是為了確定類型的絕對安全,鍊式調用

46. type相當于起個别名

47.  spark很少使用 結構類型 不想從類或者接口的角度限制它, 傳入的參數包含某種方法

48. 複合類型(extend ....with ....with.... )與結構類型結合使用 

49.infix type (中置類型)  中置表達式(右結合)   :&gt; 代表函數名   中置類型:類型名稱寫在兩個參數中間,泛型的執行個體在類型的兩側

50.self type 自身類型 self =&gt; 給this執行個體指針起别名   内部類引用非常友善  this:s1 =&gt;自身類型執行個體限制必須混入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中代碼塊轉換成偏函數,說他是偏函數因為傳回的計算結果有很多類型

60.  主線程當作actor使用 self.receive{}   main主線程接受其他線給主線程發送的消息

      self.receivewithin()  指定逾時時間不會一直阻塞

      sender !  給發送者傳回消息

      線程之間使用case class或者class object傳遞消息

61. react loop 線程重用   替代while(true) { recieve { } }的方式

62.scala swing程式設計覆寫top方法

63. listento(button)  deafto(button) 監聽和解除監聽

事件棧

    reactions +={

   case buttonclicked(button)=&gt;{

    }

  }

64.for循環中的模式比對

  for其實調用的是foreach

for((k,v:int) &lt;-list(("spark"-&gt;5),("hadoop"-&gt;"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進而發消息

77. 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