Koltln标准库中有几个反方法很容易搞混,对初学者很难理解。他们分别是let,apply,with,run方法。熟练的使用他们可以让我们的代码更加优雅和可读
我用的Kotlin的标准库的版本是1.1.2-4,看看let方法的定义
/**
* Calls the specified function [block] with `this` value as its argument and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun T.let(block: (T) -> R): R = block(this)
我来分析下这个let方法的定义(个人观点,不对请雅正)
首先,这个let方法是一个扩展方法。是谁的扩展方法呢?是类型T的扩展方法。这些方法的定义都用到了泛型。所以我们写let方法的时候是这样写的:类实例+点+let。
其次,这个let方法接收一个参数,参数是个方法。这个方法的名字叫block。let接收的方法是一个穿入值是T类型返回值是R类型的方法。并且我们知道这个方法的反回值就是整个let方法的返回值。绕口,见谅。
最后,block(this)是整个let方法的定义,记住let方法是有返回值的。
Example:
val result ="Hello World".let {
println(this)
println(it)
520
}
println(result)
“Hello Wrold”就是我们let定义中的T。是一个String类型的对象。一对大挂号是已个匿名方法。我们也叫lambda表达式。最后一行520是这个匿名函数的返回值,也是let方法的返回值,所以result的值应该是520。我们在使用let方法的时候一般不在在乎这个let方法的返回值,我们主要是通过let方法对某个对象的进行设置。
Example的打赢结果
System.out: com.example.kotlintest.MainActivity@4df51d4
System.out: Hello World
System.out: 520
it是Kotlin的一个关键字,在这个例子中代表T,因为lanmbda表达式只有一个参数,我们可以用it来代替这个参数。整段代码我是写在onCreate方法中的所以这个println(this)中的this代表的是MainActivity这个对象。讲好累let讲完了,不知道你有没有理解。知道了let下面几个就容易理解多了。很类似但也不同。
Koltin和Java的比较
// Java
if (message != null) {
System.out.println(message)
}
// Kotlin 如果message是null下面这行忽略
message?.let { println(it) }
首先看看apply方法的定义
/**
* Calls the specified function [block] with `this` value as its receiver and returns `this` value.
*/
@kotlin.internal.InlineOnly
public inline fun T.apply(block: T.() -> Unit): T { block(); return this }
apply方法是类型T的方法扩张方法
apply方法有有个参数,这个参数也是T的扩展函数。这样当我们用lambda表达式去调用这个方法的时候,this就表示这个类型T的对象了。在apply方法的方法体中我们看到有两行代码,分别是block(this)和return this。所以我们知道这个apply方法返回的就是这个T对象。block()表示对参数方法的调用。
举个例子
val result ="Hello World".apply {
println(this)
// println(it) // 编译器报错,lambda表达式没有参数it不能用
520
}
println(result)
看下打印的结果:
System.out: Hello World
System.out: Hello World
先看定义
/**
* Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun with(receiver: T, block: T.() -> R): R = receiver.block()
举个例子
val result = with("Hello World") {
println(this)
// println(it) // 编译器报错,lambda表达式没有参数it不能用
520
}
println(result)
打印结果
System.out: Hello World
System.out: Hello World
定义
/**
* Calls the specified function [block] with `this` value as its receiver and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun T.run(block: T.() -> R): R = block()
run方法和apply方法很类似,就是返回值不同
直接例子。想想……
例子
val result = "Hello World".run {
println(this)
// println(it) // 编译器报错,lambda表达式没有参数it不能用
520
}
println(result)
打印结果
System.out: Hello World
System.out: 520