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