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一般只用于修饰高阶函数,而不会乱用它。