概述高階函式是指使用其他函式作為引數、或者返回乙個函式作為結果的函式。在scala中函式是「一等公民」,所以允許定義高階函式。這裡的術語可能有點讓人困惑,我們約定,使用函式值作為引數,或者返回值為函式值的「函式」和「方法」,均稱之為「高階函式」。
1.作為值的函式
在scala中,函式就像其他資料一樣,你可以在變數中存放函式:
def main
(args: array[string]
): unit =
def fun
(x:int)
: int =
2.匿名函式
scala中,不需要給每個函式命名,正如你不需要給每個數字命名一樣。以下是乙個匿名函式:
(x:int)
=>x-
1
相當於把乙個函式簡寫了:
def fun
(x:int)
: int =
同樣,匿名函式也可以賦給乙個變數:
val f =
(x:double)
=>x-
1array
(3.12
,5.23
,8.35).
map(f)
.foreach
(println)
//這裡map中得函式變數將集合裡的每個元素-1
array
(3.12
,5.23
,8.35
) map
foreach
(println)
//也可以使用{}以及中置表示法(沒有句點),這種方法比較常見
3.函式引數
(1)基本用法:
函式既然可以被當作變數以及使用匿名函式簡寫,當然也能被當作引數,這便是高階函式最終形奧義。
在一般函式中,使用的都是基本資料型別作為引數:
def fun
(a:int,b:double)
:double=
把簡寫的函式當作引數和基本引數放進乙個函式(高階)裡,解決更複雜的邏輯:
def fun
(x: int, f:
(double)
=> double)
: double =
f(x)
一般格式:
def 函式名 (…,函參名(引數型別)=>結果型別)=表示式/呼叫函式引數
(2)產生新的函式
def main
(args: array[string]
): unit =
def mulfun
(factoy:int)
=(x:int)
=>x*factoy //返回乙個匿名函式
疑問:這和在普通函式裡呼叫其他函式有什麼不一樣嗎?
如果將乙個數值9和乙個函式math.sqrt傳入上述高階函式中:
val res =
fun(
9, math.sqrt)
或者將9和自定義的平方函式傳入:
val res =
fun(9,
(x:double)
=>x*x)
(3)自動推斷
當你將乙個匿名函式當作引數傳給另乙個函式時,scala會自動幫你推斷函式的型別資訊:
比如,你的**原本是這樣的:
val res = fun(9,(x:double)=>x*2)
可以寫成這樣:
val res = fun(9,_*2)
注意:只有當引數只在後面出現一次,才能用_替代
從舒適度上來講,這是終極版本了,但前提是這些簡寫方式在引數型別已知的情況下有效:
val fun = _ *2 //錯誤,無法推斷
val fun = (_:double)*3 // ok
3.一些有用的高階函式
4.柯里化
指將原來接受兩個引數的函式變成接收乙個引數函式的過程:
兩個引數:
def mul
(x:int,y:int)
= x*y
乙個引數,返回乙個函式:
def mul
(x:int)
=(y:int)
=> x*y
要計算兩個數二點乘積,你需要呼叫:
mul (2)
(3)//6
最終形態——scala支援如下的簡寫來定義這樣的柯里化函式:
def mul
(x:int)
(y:int)
=x*y
//呼叫
mul(2)
(3)
scala入門 (五) scala高階函式用法
前言 上一節對scala的匹配模式,做了乙個大致的介紹。這一節將對scala的高階函式進行乙個入門。作為一門函式式程式語言,想要用好這門語言,scala函式的高階用法還是比較重要的。同樣再介紹相關知識的時候,會和python進行對比。字串高階操作 格式化字串操作 在python中格式字串的方式比較多...
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 將函...