kotlin-第二章

2020-11-20  本文已影响0人  JuliusL

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

上一篇 下一篇

猜你喜欢

热点阅读