8、高階函數
阿新 • • 發佈:2018-10-04
star 參數 obj override name current 高階函數 str math
普通函數
高階函數:參數或返回值是函數
object a_基礎 { def main(args: Array[String]): Unit = { println(mymax(1,2,math.max)) println(myadd(1)(2)) } def mymax(a:Int,b:Int,f:(Int,Int) => Int)={ //f類型的映射即函數 f(a,b) } def myadd(a:Int)={ //返回值類型是函數,inner _ 表示函數本身 def inner(b:Int)={ a + b } inner _ } }
匿名函數
scala> arr.map((i:Int) => i*2:Int) //寫明返回值類型 res24: Array[Int] = Array(2, 4) scala> arr.map((i:Int) => i*2) //推斷返回值類型 res25: Array[Int] = Array(2, 4)
scala> arr.map((i) => i*2) //類型推斷 res29: Array[Int] = Array(2, 4) scala> arr.map(i => i*2) //再簡化 res30: Array[Int]= Array(2, 4)
scala> arr.map(_*2) //i就出現了一次,最終版 res32: Array[Int] = Array(2, 4)
柯裏化
定義:將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。即柯裏化後的函數返回以原來第二個參數作為參數的函數
scala> def add(a:Int,b:Int)=a+b //原函數 add: (a: Int, b: Int)Int^ scala> def add(a:Int)={b:Int => a + b} //柯裏化 add: (a: Int)Int => Int scala> add(1)(2) res0: Int = 3 scala> def add(a:Int)(b:Int) =a + b //柯裏化簡化 add: (a: Int)(b: Int)Int scala> add(3)(4) res1: Int = 7
好處:將某個參數單獨拎出來,以提供更多用於類型推斷的信息
控制抽象
在scala中,一系列語句可組成不帶參數也沒有返回值的函數
object c_控制抽象 { def main(args: Array[String]): Unit = { runinthread(println(Thread.currentThread().getName())) runinthread(println(Thread.currentThread().getName())) } def runinthread(block: => Unit): Unit ={ new Thread() { override def run(): Unit ={ block } }.start() } }
8、高階函數