Scala入門筆記

jopen 8年前發布 | 34K 次閱讀 Scala Scala開發

本博客采用創作共用版權協議, 要求署名、非商業用途和保持一致. 轉載本博客文章必須也遵循 署名-非商業用途-保持一致 的創作共用協議.

Scala簡介

Scala 是一門多范式的編程語言, 由 Martin Odersky 于2001年基于Funnel的工作開始設計Scala并于2004年正式發布

  • Scala是一種純面向對象的語言,每個值都是對象
  • Scala是一門多范式編程語言, 支持命令交互式, 函數式, 面向對象
  • 編譯型高性能語言( 靜態 )
  • 與Java無縫兼容, 可以使用任何Java庫

代碼風格

  1. 函數和變量以 小駝峰命名
  2. 類和特質以 大駝峰命名
  3. 常量使用全大寫命名
  4. 一般使用兩格縮進
  5. Scala大部分情況可以忽略語句末尾的分號

Scala變量

Scala中盡量避免使用變量, 函數式編程的一個重要特性是 不可變性 (不可變變量沒有副作用)

  • Scala是靜態類型語言, 但是不需要顯式的指明變量類型, Scala采用類型推斷( Type Inference )
//定義一個變量
varx =0

// 定義
valy =1

Scala基本類型和操作

String和值類型Byte, Short, Int, Long, Float, Double, Char, Boolean

  • Scala的操作符不是特殊的語言語法, 任何方法都可以是操作符
  • 操作符分為前綴, 中綴, 后綴
  • Scala中所有操作符都是方法調用
# 前綴
scala> (2.0).unary_-
res1:Double= -2.0

# 中綴
scala> x indexOf 'o'
res0:Int=4

# 后綴
scala> val x = "Hello, World"
x:String=Hello,World
scala>x.toLowerCase
res0:String= hello, world
  • 中綴操作符的兩個操作數, 一個在左一個在右
  • 前綴操作符方法名在操作符上加了 unary_ 前綴( +, -, !, ~ )
  • 后綴操作符是不用點或括號調用的不帶任何參數的方法

算術操作符: +, -, *, /, %
關系, 邏輯和位操作: >, <, >=, <=, ==, !=, &&, ||, &, |, ^, ~(反碼)
位移操作: <<, >>, >>>(無符號右移)

Scala函數

函數式語言的一個主要特征是, 函數是第一類結構

函數定義如下圖:

  • Unit 的結果類型指的是函數沒有返回有用的值

函數式對象

object和class的區別在于: object關鍵字創建一個單例對象

  • 主構造器是類的 唯一入口 , 只有主構造器可以調用超類構造器
  • override 關鍵字用于在重載父類的非抽象成員和成員函數
  • 同一個類內函數名相同而參數類型和個數不同的函數重載不需要 override
classRational(n: Int, d: Int){

//precondition
 require(d != 0)

// 私有成員
privatevalg = gcd(n.abs, d.abs)
varnumer: Int = n / g
vardenom: Int = d / g

// auxiliary constructor, 相當于python中__init__構造函數
defthis(n: Int) =this(n,1)
// 函數重載
overridedeftoString = n +"/"+ d;

defadd(other: Rational): Rational =
newRational(numer * other.denom + other.numer * denom, denom * other.denom)

def-(other: Rational): Rational =
newRational(numer * other.denom - other.numer * denom, denom * other.denom)

// 函數重載
def-(i: Int): Rational =
newRational(numer - i * denom, denom)

def*(other: Rational): Rational =
newRational(numer * other.numer, denom * other.denom)

deflessThan(other: Rational): Boolean =
this.numer * other.denom < other.numer *this.denom

defmax(other: Rational): Rational =
if(lessThan(other)) otherelsethis

privatedefgcd(a: Int, b: Int): Int =
if(b ==0) aelsegcd(b, a % b)
}

varx =newRational(1,3);
vary =newRational(5,7);

println(x add y)
println(x * y)
println(x - 1)

// 隱式轉換, 放在解釋器方位內
implicit defintToRational(x: Int) =newRational(x)
println(1- x)

繼承和多態

  • 繼承
  • 多態和動態綁定特性

動態綁定的特性即父類指針可以指向子類對象, 通過父類指針調用成員方法時, 會查找實際所指向的對象, 然后調用對象的內的對應方法

valel: Element =newArrayElement(Array("hello"))
vale2: ArrayElement =newLineElement("hello")

內建控制結構

表示式會產生一個值

  • Scala中if是能返回值的表達式, Scala中沒有三元操作符, 但通過 if (condition) var1 else var2 可以實現三元操作符的功能
  • while和do-while被稱為 循環 , 不產生有意義的結果
  • Scala中for語句非常強大, for {子句} yield {循環體}
  • match表達式可以產生值, match遠強大與其他語言中的 switch , 而且不需要顯示的聲明break
  • 變量范圍: 大括號引入了一個新的范圍, 內部變量會遮蓋同名的外部變量
  • 占位符語法
  • 函數文本(匿名函數, 類似于python中的lamda)

var filename = if(!args.isEmpty) args(0)else"default.txt"


var filesList = (newFile(".")).listFiles
// i <- 1 to 4(包含4), i <- 1 until 4 (不包含4)
for(file<- filesList
iffile.isFile;
iffile.getName.endsWith(".scala"))// 過濾器使用分號隔開
println(file)

var firstArg = if(args.length >0) args(0)else""
// 任何種類的常量和其他都可以作為case
firstArg match {
case"text"=>println("text")
case_ =>println("default")
}

// 匿名函數的寫法(lambda)
scala> var someNumbers = List(1,2,3,4)
scala> someNumbers.filter(x => x % 2==0)

// 占位符語法
scala> someNumbers.filter(_ % 2==0)

// 偏函數 partial funciton
scala> defsum(a:Int, b:Int, c:Int) = a + b + c
scala> val a = sum(1, _:Int,3)
scala> a(2)

// 變長參數(Array[String])
scala> defecho(args: String*) =for(arg <- args)println(arg)
scala> echo("one")
scala> echo("one","two")


classDefaultConstructor ( name:String , age:Int){
defthis(name:String){
/*自定義構造器,必需首先調用默認構造器*/
this(name ,24) ;
 }
defshow(){
println( name +"-->"+ age ) ;
 }
}

柯里化(carry)

// 普通函數
defsum(x:Int, y:Int) = x + y

// 柯里化函數
defsum(x:Int)(y:Int) = x + y

// 實際執行
defsum(x:Int) = (y:Int) => x + y

特質(trait)

特質就像帶有具體方法的java接口

特質和抽象類的區別: 抽象類主要用于有明確的父子繼承關系的類樹, 而特質可以用于任何類

特質定義使用 trait 關鍵字

traitPerson(){
defdetail() {
 println("I'm angry!")
 }
}

// 使用extends或with混入特質, 從特質繼承的方法可以像從超類繼承的方法使用
classStudentextendsPersonwithBoy{
}

數據結構

  • Python中常用 list, tuple, set, dict
  • Scala對應的數據結構為 List, Tuple[X], Set, Map(HashMap)
  • Scala中默認為不可變對象, 操作會生成一個新的對象

  • Scala采用 java平臺的包機制
  • 使用import來進行引用
packagecom.zhihu.antispam

參考鏈接

來自: http://andrewliu.in/2016/01/16/Scala入門筆記/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!