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
相关产品推荐
相关产品推荐

