1. 程式人生 > >scala程式設計-函式與閉包

scala程式設計-函式與閉包

3.頭等函式

3.1

object foreach_test{
    val someNumbers = List(1,2,3,4,5,65)
    //所有集合類都能用到的foreach方法。他以函式作為入參,並對每個元素都呼叫該函式,下面是如何用他列印輸出所有列表元素的程式碼:
    someNumbers.foreach((x:Int) => println(x))
}
foreach_test

3.2

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //集合類的filter方法選擇集合裡可以通過使用者提供的測試的元素。測試時通過呼叫作為入參的函式實現的
    val newList = someNumbers.filter((x:Int) => x > 5)
}
println(myFilter.newList)

4.函式字面量的短格式

4.0

//一種讓函式字面量更簡短的方式是去除引數型別,某些引數的型別是被推斷的

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //集合類的filter方法選擇集合裡可以通過使用者提供的測試的元素。測試時通過呼叫作為入參的函式實現的
    val newList = someNumbers.filter(x => x > 5)
}
println(myFilter.newList)

5佔位符語法

5.0

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //為了讓函式字面量更加簡潔,可以把下劃線當做一個會更多引數的佔位符,只要每個引數在函式字面量內僅出現一次
    val newList = someNumbers.filter(_ > 3)
}
println(myFilter.newList)

5.1

錯誤

val f = _ + _

//有時把下劃線當做引數的佔位符,編譯器可能無法推斷缺失的引數型別

//error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
val f = _ + _

正確

val f = (_: Int) + (_:Int)

6.部分應用函式

6.1

object myforeach{
    val someNumbers = List(1,2,34,4,56)
    //等價於someNumbers.foreach(x => println(x))

    //因此這個例子中的下劃線不是單個引數的佔位符。他是整個列表的佔位符。
    someNumbers.foreach(println _)
}
myforeach

以這種方式使用下劃線時,你就正在寫一個部分應用函式。scala裡當你呼叫函式,傳入任何需要的引數,實際是把函式應用的到引數上。