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

Kotlin中赋值与赋值表达式的区别及代码优化解析

Kotlin中赋值与赋值表达式的区别

先看你提供的两段代码:

原代码:

fun bind(item: ReturnRequestRowVO) {
    returnRequestInfoDate?.text = item.dateReturnPurchaseText?.let {
      HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT)
    }
    setupReturnRequestBtn(item)
}

Android Studio优化后的代码:

fun bind(item: ReturnRequestRowVO) {
    item.dateReturnPurchaseText?.let {
      HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT)
    }.also { returnRequestInfoDate?.text = it }
    setupReturnRequestBtn(item)
}

核心区别说明

在Kotlin里,赋值操作本身就是表达式——它会返回被赋予的值。所谓的“赋值语句”只是我们把赋值表达式当作独立语句来使用(不接收它的返回值),二者的本质关系是:赋值表达式是基础,赋值语句是赋值表达式的一种使用场景。

举个直白的例子:

  • 写val x = (y = 5)时,y = 5是赋值表达式,它会返回5,所以最终x的值也是5。
  • 单独写y = 5时,就是把赋值表达式当作语句来执行,只完成赋值动作,忽略它的返回值。

结合你的代码理解

你的两段代码最终效果完全一致,优化建议只是利用Kotlin的链式调用风格调整了结构:

  1. 原写法里,returnRequestInfoDate?.text = ...是把let的返回值直接赋值给text,这里的赋值是作为独立语句使用,没用到它的返回值。
  2. 优化后的写法,用let处理文本得到转换结果后,调用also来执行赋值逻辑。also的特性是不改变链式调用的返回值(它会返回调用它的原对象),这里的returnRequestInfoDate?.text = it依然是赋值表达式,只是被放到also的lambda里,让代码从“计算值→单独赋值”变成了连贯的链式调用,更符合Kotlin的函数式编码风格。

内容的提问来源于stack exchange,提问作者Manuel AS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:35:04