scala學習筆記 基礎

2021-07-04 20:05:07 字數 3412 閱讀 4072

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...