概述
前言
为什么要用标准库函数?因为 言简意赅! 本篇介绍的是 let、run、apply、also、with 函数。
一、let
将调用者作为 函数block 的参数,最终返回 函数block 的返回值。
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
例子
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
// and more function calls if needed
}
let 函数只有一个 lambda 函数作为参数,所以 let 的 " () " 可以省略不写。
lambda 函数只有一个参数,所以在代码块中可以用 " it " 来代替
lambda 函数块中没有return 语句,但是会隐式返回最后一行函数的返回值
二、run
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
返回结果和 let 很一样,不同的是 bloack 代码块中 默认的方法和变量引用都是基于 调用者。因为调用者是这个表达式的接收者类型
例子
File("").run {
setReadable(true)
setWritable(true)
}
三、apply
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
返回的是 apply 函数 的调用者实例,同时,调用者也是该表达式的接受者类型
val file = File("").apply {
setReadable(true)
setWritable(true)
}
四、also
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}
将调用者做作为 bloack 表达式的参数,返回调用者
val file = File("").also {
it.setReadable(true)
it.setWritable(true)
}
五、with
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
与之前的标准函数调用方式不一样,这是把接受者作为参数使用,返回的还是表达式的返回值
with(File(""),{
setWritable(true)
setReadable(true)
})
最后总结
函数 | 对象引用 | 返回值 |
let | it | lambda result |
run | this | lambda result |
with | this | lambda result |
apply | this | Context object |
also | it | Context object |
最后
以上就是慈祥可乐为你收集整理的Kotlin 标准库函数前言的全部内容,希望文章能够帮你解决Kotlin 标准库函数前言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复