Scala 函式,方法,高階函式,巢狀方法

2021-09-26 03:14:06 字數 1665 閱讀 6743

在scala中,函式是 「一等公民」 ,就是和 int,string等基本型別一樣的地位。

函式表示式是可以計算的語句。

函式是帶有引數的表示式。

可以定義乙個匿名函式(沒有名字),用來直接作為 引數,傳入高階函式。

(x: int) => x + 1
也可以函式命名,函式可以帶乙個或多個引數。

val add = (x: int, y: int) => x + y
方法

方法的表現和行為和函式非常類似,但是它們之間有一些關鍵的差別。

方法由def關鍵字定義。def後面跟著乙個名字、引數列表、返回型別和方法體。

方法可以接受 乙個或多個 引數列表。還可以沒有引數列表。

def addthenmultiply(x: int, y: int)(multiplier: int): int = (x + y) * multiplier
方法也可以有多行的表示式。

def getsquarestring(input: double): string =
方法體的最後乙個表示式就是方法的返回值。(scala中也有乙個return關鍵字,但是很少使用)

高階函式

高階函式是指使用其他函式作為引數、或者返回乙個函式作為結果的函式。

我們約定,使用函式值作為引數,或者返回值為函式值的「函式」和「方法」,均稱之為「高階函式」。

我們可以使用匿名函式,直接作為引數傳遞給map:

val salaries = seq(20000, 70000, 40000)

val newsalaries = salaries.map(x => x * 2) // list(40000, 140000, 80000)

注意在上述示例中x沒有被顯式宣告為int型別,這是因為編譯器能夠根據map函式期望的型別推斷出x的型別。對於上述**,一種更慣用的寫法為:

val salaries = seq(20000, 70000, 40000)

val newsalaries = salaries.map(_ * 2)

既然scala編譯器已經知道了引數的型別(乙個單獨的int),你可以只給出函式的右半部分,不過需要使用_代替引數名(在上乙個例子中是x)

你同樣可以傳入乙個物件方法作為高階函式的引數,這是因為scala編譯器會將方法強制轉換為乙個函式。

對於 有多個引數列表的方法,在傳入高階函式時,如果只指定了某前幾個引數列表,那麼後面的幾個引數列表會作為 被強制轉換為的函式需要提供的引數列表。

巢狀方法

在scala中可以巢狀定義方法。

在乙個方法中,定義另乙個方法,並可以呼叫。

例如以下物件提供了乙個factorial方法來計算給定數值的階乘:

def factorial(x: int): int =   

fact(x, 1)

} println("factorial of 2: " + factorial(2))

println("factorial of 3: " + factorial(3))

Scala高階函式

在scala中,無法直接操縱方法,只能直接操縱函式,所以需要使用 import scala math.val temp ceil val num 3.14 println fun temp num temp的型別是 double double,意為接受double引數並返回double的函式。能夠對...

Scala 高階函式

import scala.math.val num 3.14val func ceil 意味著確實指的是這個函式,而不是忘記了傳引數 func是乙個函式變數,內容儲存的是個函式 val v func num println v val arr array 1.0,3.14,4 map func 將函...

Scala高階函式

高階函式 higher order function 高階函式可以使用其他函式作為引數,進入方法內使用,或者使用函式輸出結果作為引數。object demo 函式1,返回當前時間納秒數,long型別 def time t long 可以簡寫為t long,long表示如果傳入引數為方法時返回值為lo...