scala:函數作為值或參數進行傳遞、作為返回值進行返回
@
函數可以作為值進行傳遞
- 語法
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的永遠不能省略圓括弧。
- 匿名函數如果只有一行,則大括弧也可以省略
- 如果參數只出現一次,則參數省略且後面參數可以用_代替