You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中with函数是否有apply/run/also/let无法替代的用途?

何时用Kotlin的with函数?

先明确with的核心特性:它是个顶层函数,接收一个非空对象和lambda,lambda里的上下文就是这个对象(用this指代,还能省略),最后返回lambda的执行结果。和apply/run/also/let比,它的定位是针对已有非空对象的批量操作,且更关注操作后的结果而非原对象本身。

适用场景&示例

1. 避免重复写对象名,简化批量操作

如果你要给一个对象的多个属性赋值、调用多个方法,用with能省去反复敲对象名的麻烦:

data class Player(var name: String, var level: Int, var score: Long)

fun main() {
    val player = Player("Guest", 1, 0)
    
    // 用with处理,代码更简洁
    val playerStats = with(player) {
        name = "ShadowKnight"
        level = 15
        score = 25000
        "Player: $name | Level: $level | Score: $score"
    }
    
    println(playerStats) // 输出:Player: ShadowKnight | Level: 15 | Score: 25000
}

要是不用with,你得写一堆player.name = ...、player.level = ...,啰嗦还容易出错。

2. 操作临时对象,直接返回结果

当你创建一个临时对象(比如StringBuilder、ArrayList),并想直接基于它生成最终结果时,with的写法逻辑更连贯:

fun buildShoppingList(): String {
    return with(mutableListOf<String>()) {
        add("Milk")
        add("Eggs")
        add("Bread")
        joinToString(prefix = "Shopping List:\n- ", separator = "\n- ")
    }
}

这里用mutableListOf().run { ... }也能实现,但with的写法更强调“对这个列表执行一系列操作”的逻辑,可读性稍好一点。

有没有with能做到但另外四个函数做不到的场景?

没有。with的所有功能都能被其他函数替代:

  • 想用上下文this操作对象并返回结果?用obj.run { ... }完全等价;
  • 想返回原对象?用apply;
  • 想用it指代对象而不是this?用let或also。

唯一的细微差异是:with是顶层函数,不能直接处理null对象(传null会直接抛NPE),而run作为扩展函数可以用obj?.run { ... }做安全调用——但这是with的局限,不是优势。

说白了,with就是个语法糖,给你多一种写法选择,让代码在某些场景下更符合阅读习惯,并没有不可替代的功能。

内容的提问来源于stack exchange,提问作者Ahmed Eid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:31:23