Scalajava
面向對象、函數式編程、更高層的併發模型—裏面包含編譯器、類庫編程
它不存在成員變量,經過object(單例)取代設計模式
函數處理:能夠吧函數化成一個參數傳過去數組
Object:入口類關鍵字-項目入口 相似於Java中的main方法網絡
Def:函數聲明—定義一個方法/函數併發
Val:常量聲明app
Any:公共超類型 scala中父類函數式編程
Unit:返回值爲空—Java中的void()函數
伴生對象:object修飾的對象,其中存放的是靜態方法、屬性 --對象聲明this
伴生類:class修飾的類,存放的非靜態方法、屬性 類聲明
Scala中無任何操做符,全部操做符運算都是對方法的調用?????
For(i<-1 to/until 10) 表示1—10(to表示包含10/until表示不包含10)
特質:Function2 有兩個參數的函數 (兩個參數一個返回值)
函數式對象,方法(成員)不是對象
方法經過methodname轉化成函數,當吧方法做爲參數傳遞的時候,scala會自動把方法轉成函數
遞歸方法須要指定返回值類型
Head:頭 tail:出去頭之外的其餘元素序列
Init:除最後一個,全部元素
函數體在{}中,但沒有前面的=號,那麼返回值類型是unit,這樣的函數叫過程
調用它是爲了使用它的反作用,好比:打印圖案
.mkstring 打印集合中內容,以字符串顯示
.filter() 過濾掉參數中爲false的元素
Scala集合
特質:就是Java中的接口
在scala中[ ] 表示泛型
輸入=>輸出
元素拼接集合 ::
集合拼接集合 ::: 兩個集合是list類型
:+ 在尾部追加元素 + :在頭部
++ 鏈接兩個集合
Flateen 平坦化 List(list(1,2,3),List(12,23))-àList(1,2,3,12,23)
將嵌套的結構展開,將裏面的每一個list去掉
Map
Groupby:就是把一個東西變成map
List.apply() 建立一個list對象,通常apply()省略不寫
Seq(相似於list集合) 有前後次序的序列 indexedseq
Set 不可重複,可是無序的集合,list是可重複,有序的集合
Map 存放,keyvalue鍵值對構成的對偶的映射,sortedMap map中能夠嵌套集合
Scala全部集合都擴展了iterable特質
Foreach() 遍歷 提交任務
Scala可變集合
List中的一些方法
.distinct 去重
.sortwith 以字典序排序
.intersect 交集
Scala隱士轉換
scala隱式轉換
背景:設計模式中有代理模式,能夠加強一個類的功能。
java中有靜態代理和動態代理。但實現起來繁瑣。
scala中的隱式轉換能夠方便的實現代理。
定義:
當被代理類調用了一個不存在方法或者值的時候,scala編譯器會查看調用上線文,查找是否存在該方法或者值。若是有則會隱式的將被代理類轉換成代理類。繼而執行方法或者值。
實例:
scala中的Int 有不少方法,都是經過將Int 隱式轉換爲RichInt來實現。
關鍵字:
implicit(隱式地)
使用:
三大隱式轉換:隱式類,隱式函數,隱式參數
代碼:
object ImplicitDemo {
class Dog{
def sing={
println("wang wang wang")
}
}
//定義隱式函數須要須要加上implicit關鍵字
implicit def dogToString(dog: Dog)="dog"
//定義隱式類須要須要加上implicit關鍵字
implicit class RichDog(dog: Dog){
def singOpera={
println("bei jing opera")
}
//定義隱式值須要須要加上implicit關鍵字
def say(implicit a:Int)=println(a)
}
def main(args: Array[String]): Unit = {
new Dog().sing
//隱式類轉換
new Dog().singOpera
//隱式函數轉換
println(new Dog()+"abc")
//隱式值
implicit val a=1;
new Dog().say
}
}
注意:
若是隱式類跟被代理類不在同一個包中,須要導入隱式類所在的包。
不修改原有代碼,擴展功能 實現代理
當被代理類調用一個其沒有的方法和屬性時,不會直接報錯,scala編譯器
會先查看上下文,查找是否有該方法或者屬性,則會隱士的將代理類(含有該
或屬性的類轉化成代理類)
隱士類 implicit class 類名(參數)
隱士函數 implicit def 函數名(參數)
隱士屬性 implicit val 參數名=值
上面的參數:表示要被轉換的對象
Import spark.implicit._
隱士類與被代理類不在同一個包中,須要導入隱士類所在的包
Scala模式類和模式匹配
背景:在開發中須要定義pojo類來封裝業務對象。一個pojo是有一系列字段以及set,get方法組成的。在java中,須要經過IDE幫咱們生成set get 構造 toString 等方法,相對繁瑣。scala簡化了pojo代碼的編寫。
至關於Java中的pojo (case class)
定義模式類
Case class 類名(字段1:類型,a:String)
使用模式類
直接 new 類名(參數1,參數。。。。)
模式匹配
def myPrint(any: Any)={
any match{
case 1=>println("this is num "+any)
case string:String=>println("this is string "+any)
case int:Int=>println("this is int "+any)
case Dog("luck",12)=>new Student().run
case Dog("jack",12)=>new Student().run("jack")
case Dog(name,age)=>new Student().sing()
case _=>println("default")
}
}
值、類型、對象
Scala與Java互相調用
類型只有一個String一致
在Java中不能使用scala集合,不可高級函數的調用,可將scala集合放在Java方法中
Scala調用Java API(集合、io、網絡、第三方依賴)只需遵循 scala的規範便可
Java集合轉成scala集合 .asScala
Scala集合轉成Java集合 .asJava
Scala集合比Java集合強大,通常不調用
Scala--IO
flatMap=flattent+map
map 對集合的轉換
foreach 遍歷集合,適用於io
讀取文本文件 source.fromFile(「」).mkstring