1、作為參數的函數
函數可以作為一個參數傳入到一個方法當中去
def main(args: Array[String]): Unit = { val myFunc1 =(x:Int) =>{ x * x } val myArray = Array(1,3,5,7,9).map(myFunc1) println(myArray.mkString(",")) } |
2、匿名函數
沒有名字的函數即是匿名函數,我們可以通過函數表達式來設置匿名函數
def main(args: Array[String]): Unit = { val hiddenFunc = (x:Int,y:String) => x + y println(hiddenFunc) } |
3、高階函數
1、能夠接受函數作為參數的方法,叫做高階函數
def main(args: Array[String]): Unit = { val func3:(Int,String) =>(String,Int)={ (x,y)=>(y,x) } def myMethod3(hello:(Int,String) => (String,Int)):Int ={ val resultFunc = hello(20,"hello") resultFunc._2 } println(myMethod3(func3)) } |
2、高階函數同樣可以返回一個函數類型
def main(args: Array[String]): Unit = { def myFunc4(x:Int) = (y:String) => y println(myFunc4(50)) } |
4、參數類型推斷
def main(args: Array[String]): Unit = { val array = Array(1,2,3,4,5,6,7,8,9) //map當中需要傳入一個函數,我們可以直接定義一個函數 array.map((x:Int) => x * 2 ) //進一步化簡參數推斷省去類型信息 array.map((x) => x * 2 ) //進一步化簡單個參數可以省去括號 array.map( x => x * 2 ) //進一步化簡如果變量只在=>右邊只出現一次,可以用_來代替 array.map( 2 * _ )
} |
5、閉包與柯里化
柯里化是scala當中面向函數式編程導致的一種必然的結果,最終推導而來產生的一種現象
def main(args: Array[String]): Unit = { //柯里化的定義形式 def kery(x:Int)(y:Int):Int={ x + y } println(kery(3)(5)) //柯里化的推導過程,注意方法的返回值不要定義任何的返回值類型 val keryResult = (x:Int) => (y:Int) => {x + y} def keryMethod(x:Int) ={ (y:Int) => x+ y } println(keryMethod(20)) println(keryMethod(20)(10)) //注意,方法當中的函數,調用了方法的參數,就叫做閉包 } |
再來看一個案例
/** * 柯里化的應用,比較數組集合當中兩個對應下標字符串是否相等 * @param args */ def main(args: Array[String]): Unit = { val a = Array("Hello", "World") val b = Array("hello", "world") println(a.corresponds(b)(_.equalsIgnoreCase(_)))
} |