object FirstScala extends App { var a =""; val array = Array(1,2,3); array.foreach{arg=> a+=(arg+"")} print(a) if (array.length>0) a=a.substring(0, array.length-1) println(a) }
從上述代碼中能夠看出,在array.foreach方法中能夠函數做爲其參數,arg=>a+=(arg+"")是一個匿名參數。java
定義匿名函數:函數
val cube = (x:Int)=>x*x*x val c = cube(3)
定義內部函數:
spa
def sum_of_square(x:Int,y:Int):Int={ def square(x:Int):Int={ x*x } square(x)+square(y) }
構造函數scala
構造函數不是特殊的方法,和java有點區別,他是除了類方法之外的代碼。
code
class Calculator(brand: String) { /** * A constructor. */ val color: String = if (brand == "TI") { "blue" } else if (brand == "HP") { "black" } else { "white" } // An instance method. def add(m: Int, n: Int): Int = m + n }
從上面能夠看出Calculator構造函數定義了一個變量color,然而他直接用的是if表達式,可見表達式在scala中佔了很大比重繼承
特質:是一些字段和行爲的集合,能夠經過with字段進行擴展,和extends區別
get
trait Car { val brand: String }trait Shiny { val shineRefraction: Int }class BMW extends Car { val brand = "BMW"} class BMW extends Car with Shiny { val brand = "BMW" val shineRefraction = 12}
特質與抽象類的區別:string
特質不接受構造函數參數,因此你想使用構造函數初始化類,那你能夠使用抽象類。trait Car(name:String)是不合法的it
若是不須要構造參數,能夠優先選用特質,由於特質能夠進行多擴展,而只能繼承一個抽象類
io
特質支持泛型:
trait Cache[K, V] { def get(key: K): V def put(key: K, value: V) def delete(key: K) }
scala函數是有值的,這直接決定了scala中函數能夠做爲一個參數使用