let()
fun T.let(f: (T) -> R): R = f(this)
let() 是一个域函数:当你想定义一个只存在特定域且不能超出此域的变量的时候可以使用它,它对编写自包含(self-contained)的代码尤其有用,从而不会发生变量泄漏(leaking out):即在其应该被访问的地方之外被访问。
DbConnection.getConnection().let { connection ->
}
// connection is no longer visible here
let 也可用来进行非空判断:
val map : Map = ...
val config = map[key]
// config is a "Config?"
config?.let {
// This whole block will not be executed if "config" is null.
// Additionally, "it" has now been cast to a "Config" (no question mark)
}
apply()
fun T.apply(f: T.() -> Unit): T { f(); return this }
apply() 针对所有类型定义了一个扩展函数,当你调用它时,它会调用作为参数传给它的闭包(closure),然后返回运行闭包的接收对象(receiver object)。有点复杂?其实很简单也很好用,举个栗子:
File(dir).apply{ mkdirs() }
这个代码段将一个String转换成一个File对象,调用其mkdirs()方法并且返回该文件,对应的java代码则显得有些繁琐
File makeDir(String path) {
File result = new File(path);
result.mkdirs();
return result;
}
apply()可以将这种常见的代码转换为一行。
with()
fun with(receiver: T, f: T.() -> R): R = receiver.f()
当你想对同一对象调用多个不同方法时,with()是极为方便的。而不是每行都去重复使用包含该对象的变量。你可以通过with来改造
val w = Window()
with(w) {
setWidth(100)
setHeight(200)
setBackground(RED)
}
怎么样,是不是涨姿势啦。
run()
fun T.run(f: T.() -> R): R = f()
定义很简单,调用f(),返回其结果,无需赘述。
also()
fun T.also(block: (T) -> Unit):T { block(this); return this }
与apply很类似,区别在于,block函数具有参数this
参考文章:http://beust.com/weblog/2015/10/30/exploring-the-kotlin-standard-library/