Scala高階函數


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(_)))

   

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM