ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第065篇 Elvis 运算符与 let:空值处理的组合拳

第065篇 Elvis 运算符与 let:空值处理的组合拳 ?:与let是 Kotlin 里被低估的两个语法。它们的共同点是——读起来简单,但背后藏着一个可以改变代码组织方式的抽象:把"非空才执行"和"为空则兜底"这两件事,从散落在方法体里的控制流,变成可以组合的表达式。这题答好,要能讲清它们各自的求值时机、几类作用域函数的差异,以及什么时候不该用。先把结论放在前面:?:(Elvis 运算符)在左值为 null 时返回右值,右值是懒求值的;let是作用域函数,在接收者非空时把值作为参数(默认it,也可具名)传入并返回 lambda 结果。两者常配合使用:x?.let { ... } ?: default,完成"有值则处理、无值则兜底"的完整语义。 核心纪律是:Elvis 是表达式,适合做兜底与提前返回;let是作用域工具,适合在非空范围内消除重复判空。机制拆解先说 Elvis。它之所以能替代if (x == null) x = d,关键在于它是表达式而非语句:整个a ?: b有类型、有值,可以赋值、可以作为参数传递、可以作为 return 值。求值时机是它最容易被问也最有价值的一点——右值只在左值为 null 时才求值。 所以x ?: throw IllegalStateException()里的抛异常只会在缺失时触发;x ?:
返回列表