1. 程式人生 > >scala中的高階函式

scala中的高階函式

1.scala中的函式

scala是一門面向物件和函數語言程式設計相結合的語言,前面的文章已經講了類、物件、繼承等面向物件特有的語言特性,接下來將關注一下函數語言程式設計的相關知識。在scala中,函式和變數一樣,都是scala的一等公民。與函式相關的程式碼片段如下:

scala    7行

//定義一個匿名函式 (x:Int) => 3*x //將函式賦值給一個變數 val fun = (x:Int) => 3*x //將函式傳遞給一個方法或者函式時省略引數型別 map(x=>x*3)
2.高階函式

正常的一個函式只能接受常量或者普通變數作為引數,但是高階函式可以接受函式作為引數,同時高階函式的返回值也可以是函式。比如常見的有map,filter,reduce等函式,它們可以接受一個函式作為引數。

3.閉包

僅從字面上來理解,很容易將閉包和包關聯起來,其實不然。閉包是一種函式,函式的返回值依賴於宣告在外部的一個或者多個變數,這裡的返回值是指返回的函式。如:

scala    9行

//定義一個閉包 def closure(rate:Double)=(x:Int)=>rate*x //給定不同的rate值,閉包返回不同的函式 val lowrate = closure(2) val highrate = closure(6) lowrate(10) //返回20 highrate(10) //返回60
4.SAM轉換

首先SAM是Single Abstract Method的縮寫,不是山姆大叔的sam。是指單個抽象方法,比如說java swing裡面的ActionListener介面就只有一個actionPerformed方法,我們可以說ActionListener介面是SAM型別。
SAM轉換的目的就是讓這種只有一個方法的操作使用一個函式代替。比如按鈕點選後的動作,我們傳入一個函式去實現而不是new一個ActionListener的內部類去實現。如:

scala    15行

//傳統寫法 button.addActionListener(new ActionListener{ override def actionPerformed(event:ActionEvent)={ count +=1 }) //使用sam轉換 button.addActionListener((event:ActionEvent)=>count+=1) //這裡需要提供一個隱士轉換,將函式轉換成一個ActionListener的例項 implicit def makeAction(action:(ActionEvent)=>Unit) = new ActionListener{ override def actionPerformed(event:ActionEvent){action(event)} }
5.柯里化

柯里化是一個將傳入兩個引數的函式變為傳入一個引數的函式的過程。比如:
def plus(x:Int,y:Int) => x+y
變為:def plus(x:Int)=(y:Int)=>x+y

更多文章請關注微信公眾號:bigdataer