scalaschool
scala> def three() = 1 + 2
three: ()int
scala> three()
res2: int = 3
scala> three
res3: int = 3
scala> (x: int) => x + 1
res2: (int) => int =
scala> res2(1)
res3: int =2
你可以傳遞匿名函式,或將其儲存成不變數。
scala> val addone = (x: int) => x + 1
addone: (int) => int = scala> addone(1)
res4: int = 2
如果你的函式有很多表示式,可以使用{}來格式化**,使之易讀。比如匿名函式:這在將匿名函式作為引數傳遞時經常用到:
scala>
res0: (int) => int =
scala> def adder(m: int, n: int) = m + n
adder: (m: int,n: int)int
scala> val add2 = adder(2, _:int)
add2: (int) => int = scala> add2(3)
res50: int = 5
有時會有這樣的需求:允許別人一會在你的函式上應用一些引數,然後又應用另外的一些引數。
例如乙個乘法函式,在乙個場景需要選擇乘數,而另乙個場景需要選擇被乘數。
scala> def
multiply
(m: int)
(n: int): int = m * n
multiply: (m: int)(n: int)int
你可以直接傳入兩個引數。
scala> multiply(2)(3)
res0: int =6
你可以填上第乙個引數並且部分應用第二個引數。
scala> val timestwo = multiply(2) _
timestwo: (int) => int = scala> timestwo(3)
res1: int = 6
你可以對任何多引數函式執行柯里化。例如之前的adder函式
scala> (adder _).curried
res1: (int) =>
(int) => int =
這是乙個特殊的語法,可以向方法傳入任意多個同型別的引數。例如要在多個字串上執行string的capitalize函式,可以這樣寫:
def capitalizeall(args: string*) =
}
scala> class建構函式不是特殊的方法,他們是除了類的方法定義之外的**。讓我們擴充套件計算器的例子,增加乙個構造函式引數,並用它來初始化內部狀態。calculator
defined class
calculator
scala> val calc = new calculator
calc: calculator = calculator@e75a11
scala> calc.add(1, 2)
res1: int = 3
scala> calc.brand
res2: string = "hp"
class
calculator
(brand: string) else
if (brand == "hp") else
// an instance method.
def add(m: int, n: int): int = m + n
}
你可以使用建構函式來構造乙個例項:
scala> val calc = new calculator("hp")
calc: calculator = calculator@1e64cc4d
scala> calc.color
res0: string = black
上文的calculator例子說明了scala是如何面向表示式的。顏色的值就是繫結在乙個if/else表示式上的。scala是高度面向表示式的:大多數東西都是表示式而非指令。
你可以定義乙個抽象類,它定義了一些方法但沒有實現它們。取而代之是由擴充套件抽象類的子類定義這些方法。你不能建立抽象類的例項。
scala> abstract
class
shape
defined class
shape
scala> class
circle
(r: int)
extends
shape
| }defined class
circle
scala> val s = new shape
:8: error: class
shape
isabstract; cannot
beinstantiated
val s = new shape
^scala> val c = new circle(2)
c: circle = circle@65c0035b
特質是一些欄位和行為的集合,可以擴充套件或混入(mixin)你的類中。
trait
car
trait
shiny
class
bmwextends
car
通過with關鍵字,乙個類可以擴充套件多個特質:
class
bmwextends
carwith
shiny
此前,我們定義了乙個函式的引數為int,表示輸入是乙個數字型別。其實函式也可以是泛型的,來適用於所有型別。當這種情況發生時,你會看到用方括號語法引入的型別引數。下面的例子展示了乙個使用泛型鍵和值的快取。
入的型別引數。下面的例子展示了乙個使用泛型鍵和值的快取。
trait
cache[k, v]
方法也可以引入型別引數。
def remove[k](key: k)
Scala學習筆記1 Scala基礎
特點 先編譯 scalac scala 再執行 scala 值與變數 常用型別 byte,char,short,int,long,float,double,boolean 方法定義 迴圈 lazy val 用時才會載入 lazy val a 2 預設引數 def sayname name strin...
scala 基礎筆記
view bound 必須傳入乙個隱式轉換函式 class t content bound 必須傳入乙個隱式值 class t ordering 非同步傳送訊息 同步傳送訊息,等待反饋資訊 非同步傳送完成之後,返回乙個future引用 scala列表操作符 把心元素整合到現有列表的最前端 scala...
Spark學習筆記 Scala基礎(一)
載入外部資料集 val rddtext sc.textfile hellospark.txt val 變數值不可修改,一旦分配不能重新指向別的值 var 分配後,可以指向型別相同的值 val lines sc.textfile hellospark.txt lines sc.textfile hel...