Scala(三)【函數語言程式設計】
阿新 • • 發佈:2020-07-22
目錄
一.方法和函式
1.方法
1)基本語法
def 方法名(引數名:引數型別,...):返回值型別 = {方法體}
示例
def add(x: Int, y: Int): Int = {
x + y
}
2)簡化原則
1、方法體中只有一行語句的時候,{ }可以省略
示例
def add(x: Int, y: Int): Int = x + y
2、如果將方法體中最後一行表示式作為方法的返回值,返回值型別可以省略
示例
def add(x: Int, y: Int) = { x + y }
注意
方法體中有return,必須定義方法的返回值型別
遞迴方法必須定義返回值型別
3、如果方法不需要返回值, =可以省略
示例
def func(x: Int) {
print(x)
}
4、如果方法不需要引數,()可以省略
示例
def func1 = {
print("hello world")
}
注意
如果定義方法的時候,沒有(),在呼叫的時候也不能帶上()
如果定義方法的時候有(),呼叫方法的時候()可有可無
=、()、{}不能夠同時省略
3)方法引數
1.預設引數
在定義方法的時候,可以給引數一個預設值,後續在呼叫方法的時候,有預設值的引數就可以不用傳參
示例
def add(y: Int,x: Int = 2, y: Int = 3) = {
x + y + z
}
//不賦值使用預設值
add(3)
2.帶名引數
指定將值傳遞給哪個引數
add(x=3,y=4)
3.可變引數
定義func,address引數可變
def func(name:String,address:String*) ={
print(s"name:${name},address:${address}")
}
呼叫可以函式,不能直接傳遞陣列,要通過 陣列名:_* 的形式傳遞
val arr = List("北京市","豐臺區","槐房村") func("zhangsan",arr:_*) add(x=3,y=4)
注意
可變引數必須放在引數列表的最後
可變引數不能與預設值、帶名引數一起使用
2.函式
語法: val 函式名 = (引數名:引數型別,..) => {函式體}
簡化: 函式體中只有一行語句的時候,{}可以省略
示例
val func = (x:Int,y:Int) => x+y
3.方法和函式的區別
1)方法可以重寫,函式不可用重寫
2)方法是存在於方法區,函式存在堆中
3)方法可以轉成函式,函式不能轉成方法。
方法轉函式: 方法名 _
// add方法
def add(x: Int = 2, y: Int = 3) = {
x + y
}
//將add方法轉fun函式
val fun = add _
但是在Scala中,函式和方法沒有明確的界定:方法就是函式,函式也是物件
二.高階函式
定義:方法/函式
的 引數/返回值
是一個函式
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
// 定義函式
val add = (x:Int,y:Int) => x+y
// 呼叫高階函式fun1
println(fun1(1, 2, add))
三.匿名函式
定義:沒有名字的函式,一般作為值進行傳遞
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
//_+_: 簡寫(x:Int,y:Int)=>(x=y)
fun1(1,2,_+_)
四.柯里化
定義: 有多組引數列表的方法稱之為柯里化方法
示例
def m1(x:Int)(y:Int,z:Int) = x+y+z
演變過程
def fun1(x:Int):(Int,Int) => Int ={
(y:Int,z:Int) => x +y+z
}
fun1(1)(2,3)
五.閉包
定義: 函式體中使用不屬於函式本身的變數,這樣的函式稱之為閉包
示例
val x = 10
val func = (y:Int) => x+y