Scala

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可變集合

  1. 數組 Array(1,2,3)長度固定,數值可變
  2. ListBuffer(相似於Java中的ArrayList) 添加+=   刪除  remove
  3. Hashmap  更新/添加   +=(」k1」->」k2」)

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

相關文章
相關標籤/搜索