@
函式可以作為值進行傳遞
- 語法
var f = 函式名 _
- 如果明確了變數的資料型別,那麼下劃線可以省略
//函式正常的宣告與呼叫
def foo():Int={
println("foo...")
10
}
//將foo函式的執行結果賦值給res變數
//val res: Int = foo()
//println(res)
//函式作為值進行傳遞 語法:在函式名稱的後面 + 空格 加下劃線
//注意:將foo函式作為一個整體,賦值給f變數, f是函式型別 ()=>Int
//val f : () => Int = foo _
def f : () => Int = foo _
//這個時候,f就是一個函式,如果要想執行f函式的話,必須得加()
//println(f) //<function0>
//println("-----------------")
//println(f())
//var ff = foo //將函式執行結果賦值給ff
//var ff = foo _ //將函式本身作為值賦給ff
//將函式本身作為值賦給ff 如果明確了變數的型別,那麼空格和下劃線可以省略
//var ff:()=>Unit = foo
//println(ff)
函式可以作為引數進行傳遞
- 通過匿名函式
- 擴充套件函式的功能
- 提高函式的靈活度
//函式可以作為引數,進行傳遞(大多數情況都是通過匿名函式的形式)
//定義一個函式calculator,該函式接收一個函式型別的引數op,op定義了對兩個整數要進行什麼樣的操作
def calculator(a:Int,b:Int,op:(Int,Int)=>Int): Int ={
op(a,b)
}
//定義一個函式f1,完成兩個整數的加法運算
def op(a:Int,b:Int):Int={
a + b
}
//println(calculator(10,20,op))
println(calculator(50, 20, (a: Int, b: Int) => {
a - b
}))
println(calculator(50, 20, _ - _))
println(calculator(50, 20, _ + _))
*/
函式可以作為返回值進行返回
- 函式的巢狀
- 函式鏈式呼叫,通過引數傳遞資料,在執行的過程中,函式始終佔據棧記憶體,容易導致記憶體溢位
- 閉包
- 柯里化
//函式可以作為返回值進行返回----函式的巢狀
def f1():()=>Unit ={
def f2(): Unit ={
println("f2函式被呼叫了")
}
//將f2作為返回值返回給f1
f2 _
}
//ff就是f2
//var ff = f1()
//ff()
//f1()()
什麼是匿名函式
- 引數的型別可以省略,會根據形參進行自動的推導
- 型別省略之後,發現只有一個引數,則圓括號可以省略;其他情況:沒有引數和引數超過1的永遠不能省略圓括號。
- 匿名函式如果只有一行,則大括號也可以省略
- 如果引數只出現一次,則引數省略且後面引數可以用_代替