05:函數與Lambda閉包
1. 有默認參數的函數
通常用於函數重載特別多的時候
有默認值的函數可以大大減少函數的重載數量
fun print(name:String = "zhang tao"){
println(name)
}
fun main() {
print()
2. 如果函數中只有一條語句
可以直接賦值該語句給函數
fun print(name:String = "zhang tao") = println(name)
3. 函數嵌套
一般用於在某些條件下出發遞歸的函數
或不希望被外部訪問到的函數
fun function() {
var str = "hello"
fun say(count: Int = 10) {
println(str)
if(count>0){
say(count-1)
}
}
say()
}
fun main() {
function()
}
06:擴展函數
kotlin可以靜態給一個類擴展它的成員變量和成員方法
對第三方SDK或那個類是你不能控制的類,你想給他新增一些你需要用到一些方法的時候
java中調用kotlin的擴展函數,第一個參數一定是擴展的那個對象。
fun File.readText(charset: Charset = Charsets.UTF_8): String = readBytes().toString(charset)
var file = File("")
val content = file.readText()
String content = FileKt.readText(file,Charsets.UTF_8)
擴展函數的靜態解析
open關鍵字表示不final,與java的final關鍵字正好相反,因爲kotlin聲明一個類的時候會默認添加final修飾符。
kotlin擴展函數是靜態給一個類添加的,不具備運行時的一個多態效用的。
open class Animal
class Dog : Animal()
fun Animal.name() = "animal"
fun Dog.name() = "dog"
fun Animal.println(a:Animal){
println(a.name())
}
fun main() {
//輸出animal
Dog().println(Dog())
}
07:Lambda閉包
java最初
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
}
});
java8的Lambda
Thread thread = new Thread(()->{
});
kotlin的Lambda
val thread = Thread({ -> Unit })
如果Lambda沒有參數,可以省略箭頭符號->
val thread = Thread({ Unit })
如果Lambda是函數的最後一個參數,可將大括號放在小括號外面
val thread = Thread(){ }
如果函數只有一個參數,且這個參數是Lambda,則可省略小括號
val thread = Thread{ }
Lambda閉包聲明
kotlin中lambda閉包參數是有上限的,最多22個
val echo ={name:String->
println(name)
}
08:高階函數
高階函數:函數的參數是函數
當Lambda作爲函數的最後一個參數時,可以寫在函數的小括號之外
fun onlyIf(isDebug: Boolean, block: () -> Unit) {
if(isDebug){
block()
}
}
fun main() {
onlyIf(true){
println("haha")
}
}
函數是”一等公民”
用內聯優化代碼
kotlin的Lambda是一個匿名對象
可以使用inline修飾方法,這樣當方法在編譯時就會拆解方法的調用爲語句調用,進而減少創建不必要的對象。
inline一般只用於修飾高階函數,而不會亂用它。