Kotlin ViewModel字符串拼接问题求助:状态文本生成代码修正
Kotlin ViewModel血糖状态文本生成代码修正与字符串拼接指导
原代码核心问题
- 变量作用域错误:每个if/else分支内定义的
ftxt、btxt等仅在当前分支块内有效,外部无法访问,编译直接报错 - 分支覆盖不全:空腹值99140区间、餐后值71140区间完全没有处理逻辑
- 最后else块逻辑混乱:该else属于晚餐后数值的判断分支,却重新定义所有状态变量,逻辑完全错误
- 字符串拼接方式繁琐:用
+=逐个拼接效率低,代码可读性差
修正后的完整代码
fun formula(f: Int, b: Int, l: Int, d: Int): String { // 提取通用状态判断逻辑,复用代码 fun getStatus(value: Int, isFasting: Boolean): String { return when { isFasting -> { when { value in 71..99 -> "Normal" value < 71 -> "Hypoglycemic" else -> "Abnormal" // 覆盖99以上的空腹值 } } else -> { when { value > 140 -> "Abnormal" value < 71 -> "Hypoglycemic" else -> "Normal" // 覆盖71~140的餐后值 } } } } // 分别获取各时段状态 val ftxt = getStatus(f, isFasting = true) val btxt = getStatus(b, isFasting = false) val ltxt = getStatus(l, isFasting = false) val dtxt = getStatus(d, isFasting = false) // 方式1:字符串模板+多行文本,简洁直观 return """ ${calendar.toString()} Fasting: $ftxt Breakfast: $btxt Lunch: $ltxt Dinner: $dtxt """.trimIndent() // 方式2:buildString构建,适合复杂动态拼接场景 // return buildString { // append(calendar.toString()) // append("\nFasting: $ftxt") // append("\nBreakfast: $btxt") // append("\nLunch: $ltxt") // append("\nDinner: $dtxt") // } }
Kotlin字符串拼接最优实践
- 字符串模板:用
$变量名或${复杂表达式}直接嵌入字符串,配合多行文本和trimIndent()可以快速格式化排版,代码简洁易读,是日常开发首选 - buildString函数:当需要循环拼接、条件拼接等复杂场景时,用
buildString内部的StringBuilder操作,避免频繁创建String对象,性能更优 - 尽量避免
+=拼接:每次+=都会生成新的String实例,高频拼接时性能损耗明显,代码也显得冗余
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

