本技能面向 Kotlin 中“预设列表 + 当前选中项”这类状态的设计,核心主张是:预设是列表,当前数值才是唯一事实来源,“哪个被选中”应当从数值反推,而不是另存一个标签。
用途:用于消除“选中预设”与“当前数值”两份状态不同步的问题,让选择器、拖动、重置、导入、备份恢复、迁移等所有写入路径都不必手动清理标签。
主要能力:提供 presetFor(bandsDb) 的参考实现,用 firstOrNull 遍历预设并按容差 0.01 比较各频段,返回匹配的预设或 null(表示 Custom)。主张按预设自身数值派生每行字段(如 preampDb 用 get() 计算),并说明在需要频繁读取的路径上应改为构造体内 val。
使用方式:先把预设表定义为常量;比较时用容差而非精确 ==,因为浮点数经文本往返后位模式可能不同;比较长度取两者并集,避免只匹配前缀或镜像问题;firstOrNull 意味着重复预设不可选中,若列表允许重复则必须存标签。零值情形应显式写出,不要用 -maxOf(loudest, 0f),否则只衰减的预设会得到 -0.0f,而装箱后 -0.0 不等于 0.0。
适用场景与限制:适合预设数量与频段数不大的 UI 组合场景;线性扫描为 O(预设数×频段数),量大时可用 remember(value) 缓存,或按取整数值的哈希建索引。文中明确:如果列表设计上允许重复预设,就必须存标签。验证部分给出 grep 检查不应有持久化标签、派生字段应为 getter,以及三轮往返测试:选预设后断言标签、最小步长拖动后断言为 Custom、拖回后断言重新选中原预设,并断言多值返回 null、纯衰减预设 trim 打印为 "0.0" 而非 "-0.0"。