谈一谈标准函数with、run和apply

335 阅读2分钟

kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。

with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。 看一个示例:

fun fruitListWith(){//使用With来构建吃水果的字符串,最后将结果打印出来
    val list = listOf("Apple","Banana","Orange","Pear","Grape")

    val result= with(StringBuilder()){
        append("Start eating fruit.\n")
        for (fruit in list){
            append(fruit).append("\n")
        }
        append("Ate all fruits.")
        toString()

    }

    println(result)
}

打印的日志:

image.png

run函数用法和使用场景其实和with函数是非常类似的,只是稍微做了一些语法改动而已。 首先run函数通常不会直接调用,而是要在某个对象的基础上调用;其次run函数只接收一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文。 示例如下:

fun fruitListRun(){//使用run来构建吃水果的字符串,最后将结果打印出来
    val list = listOf("Apple","Banana","Orange","Pear","Grape")

    val result=  StringBuilder().run{
        append("Start eating fruit.\n")
        for (fruit in list){
            append(fruit).append("\n")
        }
        append("Ate all fruits.")
        toString()

    }

    println(result)
}

image.png

apply函数和run函数也是极其类似的,都要在某个对象上调用,并且只接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身。

fun fruitListApply(){//使用apply来构建吃水果的字符串,最后将结果打印出来
    val list = listOf("Apple","Banana","Orange","Pear","Grape")

    val result=  StringBuilder().apply{
        append("Start eating fruit.\n")
        for (fruit in list){
            append(fruit).append("\n")
        }
        append("Ate all fruits.")
//        toString()

    }

    println(result.toString())
}

image.png

我们将kotlin中最常见的几个标准函数学完了,你会发现其实with、run和apply这几个函数的用法和使用场景是非常类似的。在大多数情况下,它们可以相互转换,但你最好还是要掌握它们之间的区别,以便在编程时能够做出最佳的选择。