函式
kotlin中,使用fun關鍵字定義乙個函式,函式引數使用 pascal 表示法定義,即 name: type。引數用逗號隔開。每個引數必須有顯式型別。
fun foo(arg1:string,arg2:boolean,arg3:int):int
當函式只有單個表示式時,可以省略花括號,直接寫在=之後,如果返回值型別可由編譯器推斷出來,也可以省略返回值型別:
fun foo(arg1:string,arg2:boolean,arg3:int)=1
//省略花括號和返回值型別後的函式形式
具有塊**體的函式,必須顯式指定返回值型別,除非返回值型別是unit。編譯器不會推斷具有塊**體的函式的返回型別,因為這樣的函式在**體中可能有複雜的控制流,並且返回型別對於讀者(又是甚至是編譯器)是很不明顯的。
fun foo(arg1:string,arg2:boolean,arg3:int):int
呼叫函式使用傳統的方法
var
value=foo()
成員函式的呼叫要使用點表示法
r().foo()
函式還可以使用中綴表示法來呼叫,當滿足一下條件時:
infix fun int.add(x:int):int
fun printadd()
我們還可以在呼叫函式的時候使用命名的引數:
fun foo(arg1:string="hello kotlin",arg2:boolean,arg3:int)
fun printfoo()
函式引數可以有預設值,當省略相應的引數時使用預設值。與其他語言相比,這可以減少過載數量。
fun foo3(arg1: string,arg2: boolean=false,arg3: int=0)
fun printfoo3()
我們還可以為函式定義可變數量的引數,只要用vararg關鍵字修飾即可:
//可變數量的引數
fun foo4(vararg args:int)
}fun printfoo4()
如果我們已經有乙個陣列並希望將其內容傳給該函式,我們使用伸展(spread)操作符(在陣列前面加 *):
//可變數量的引數
fun foo4(vararg args:int)
}fun printfoo4()
高階函式
高階函式可以將乙個函式作為引數或返回值:
fun add2(x:int=0,y:int=0):int
fun operate(x:int=0,y:int=0,body:(int,int)->int)
fungetvalue
()
lambda表示式
以上的operate()方法,我們還有乙個更簡潔的呼叫方式,即傳入乙個lambda表示式:
fun getvalue())
//函式引數傳入乙個lambda表示式
}
lambda 表示式的完整語法形式,即函式型別的字面值如下:
val sum =
lambda 表示式總是被大括號括著, 完整語法形式的引數宣告放在括號內,並有可選的型別標註, 函式體跟在乙個 -> 符號之後。如果推斷出的該 lambda 的返回型別不是 unit,那麼該 lambda 主體中的最後乙個(或可能是單個)表示式會視為返回值。
如果我們把所有可選標註都留下,看起來如下:
val sum: (int, int) -> int =
當函式引數是最後函式的最後乙個引數,並且你傳入乙個lambda表示式作為相應的引數,則可以在圓括號之外指定它:
fun getvalue())
//函式引數傳入乙個lambda表示式
operate(3,7)
}
如果lambda表示式只有乙個引數,kotlin可以自己計算出簽名,它允許我們不宣告唯一的引數,並且隱含的為我們宣告其名稱為it:
fun upcase(str:string,body:(string)->string):string
funtransform
()}
如果lambda表示式是呼叫的唯一引數,則呼叫中的圓括號可以完全省略:
fun string.upper(body:(string)->string):string
funtransform
()//lambda是呼叫的唯一引數,則呼叫的圓括號可以省略
}
匿名函式
匿名函式與常規函式一樣,只是省略了函式名稱而已:
fun string.upper(body:(string)->string):string
funtransform
()//lambda表示式是呼叫的唯一引數,則呼叫的圓括號可以省略
"hellokotlin".upper
(fun(str:string):string)
}
lambda表示式和匿名函式之間的另乙個區別是非區域性返回的行為。乙個不帶標籤的 return 語句總是在用 fun 關鍵字宣告的函式中返回。這意味著 lambda 表示式中的 return 將從包含它的函式返回,而匿名函式中的 return 將從匿名函式自身返回。
fun foo()
}
值得注意的是:這種非區域性的返回只支援傳給內聯函式的 lambda 表示式。 如果我們需要從 lambda 表示式中返回,我們必須給它加標籤並用以限制 return。
fun transform():string
"hellokotlin".upper(fun(str:string):string)
}
帶接收者的函式字面值
kotlin提供了指定的接收者呼叫函式字面值的功能。在函式字面值的函式體中,可以呼叫該接收者物件上的方法而無需任何額外的限定符。
這樣的函式字面值的型別是乙個帶有接收者的函式型別:
sum : int.(other: int) -> int
該函式字面值可以這樣呼叫,就像它是接收者物件上的乙個方法一樣:
1.
sum(2)
匿名函式語法允許你直接指定函式字面值的接收者型別。 如果你需要使用帶接收者的函式型別宣告乙個變數,並在之後使用它,這將非常有用。
val sum = fun int.(other: int): int = this + other
kotlin學習二 函式
宣告 funfun double x int int入口函式 mainfun main 引數 name type 函式引數使用 pascal 表示法定義,即 name type。引數用逗號隔開。每個引數必須有顯式型別 fun powerof number int,exponent int 預設引數 ...
Python3學習筆記09 匿名函式lamdba
關鍵字lambda表示匿名函式,冒號前面,面的x表示函式引數。匿名函式有個限制,就是只能由乙個表示式,不用寫return,返回值就是該表示式的結果。匿名函式有個好處,因為函式沒有名字,不必擔心函式名稱衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式 f l...
Kotlin學習4 3 建構函式
在kotlin中,建構函式用 constructor 關鍵字進行修飾,乙個類可以有乙個主建構函式和多個次建構函式。主構函式位於類頭跟在類名之後,如果主建構函式沒有任何註解或可見性修飾符 如public constructor 關鍵字可省略。主構函式定義的語法格式如下 class 類名 constru...