Kotlin的常用顶层函数总结

本文详细介绍了Kotlin中六个常用函数with、run、apply、let、also和use的定义及用法,通过实例展示了如何利用这些函数简化代码,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kotlin和Java不一样,可以定义一些顶层函数,一些顶层函数用来可以简化一些操作,让你的代码变得更加简洁易懂,说白了也就是能装逼,这里总结一下平时用的多的。主要是4个,with,run,apply,let,also,use。

with

首先看with的定义

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

with是一个高阶函数,第二个参数是T的某个方法,返回值直接返回了执行后的结果。直接先看用法

    val textView=TextView(this)
        with(textView){
            text="with"
            textColor=123456
            background=ColorDrawable(android.R.color.transparent)
        }

with主要是用来对一个对象重复操作,方便的调用方法和属性。with没有限制返回值,可以返回任何类型的变量,block中的最后一行默认就是返回值,这里返回的void 也就是Unit。这里我们直接传了一个block,我猜测编译器会把这个方法作为对应类扩展方法来直接调用。当然我们也可以这样传

    with(textView,TextView::findFocus)

直接传方法进去,不过看起来意义不大。

run

同样的定义

@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R = block()

用法

     textView?.run {
            text="with"
            textColor=123456
            background=ColorDrawable(android.R.color.transparent)
        }

感觉并没有太大区别,只是这里不需要多传一个参数,同样可以自己指定返回值类型,而且这里像这样写可以省去判空,是不是很方便。

apply

定义

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

用法

 textView?.apply {
            text="with"
            textColor=123456
            background=ColorDrawable(android.R.color.transparent)
        }

这里同样的的用法,不过返回值是确定的返回this。

let

定义

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

let的定义就和之前的稍有差别了,定义里用的方法不是T类里的方法了,无法直接调用属性,返回值依然可以随意指定,这里这样使用

 textView?.let {
            it?.text = "with"
            it?.textColor = 123456
            it?.background = ColorDrawable(android.R.color.transparent)
        }

上面除了with的方法都以做用来做简单的非空判断,比如之前java的这种代码

    if(a==null) 
            return null;
        else 
            return a.b();

就可以更简洁,更加优雅的写出来了。

also

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

also的用法也是大同小异,用来解决在返回之前要赋值给另一个对象,或者做内部的一些操作。

use

定义

@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var closed = false
    try {
        return block(this)
    } catch (e: Exception) {
        closed = true
        try {
            this?.close()
        } catch (closeException: Exception) {
        }
        throw e
    } finally {
        if (!closed) {
            this?.close()
        }
    }
}

这里可以看出来use是对流进行操作的,而且必须要Closeable来调用use,这里就额可以简单省去关闭流的操作。用法就不做演示了,其实都很简单。

kotlin中还有很多扩展方法,都很方便,使用最多的就是集合以及字符串的某些扩展方法,省去很多自己写遍历集合或者截取字符串等操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值