如何用常量存储多段数值范围以简化条件判断?
如何用常量存储多段数值范围以简化条件判断?
我来帮你捋清楚这个问题~你之前的写法之所以报错,是踩了两个小坑:一是用Lambda大括号存范围的方式不对,二是const关键字的限制比你想的要严格得多。
你写的const val values = { ... }其实是定义了一个Lambda函数,它的类型是() -> IntRange,而且const要求值必须是编译期就能确定的原始类型(比如Int、Boolean)或者String,这种复杂的函数类型自然不符合要求,所以报错是必然的。
下面给你两个实用的解决方案,完全能满足你简化代码的需求:
方案一:用普通val存储Range集合
既然const用不了(因为Range和List都不是const允许的类型),我们可以用普通的val来存储这些范围的集合,代码会很整洁:
// 定义存储多个范围的集合 val targetRanges = listOf(0..10, 20..30, 40..50) // 调用的时候这么判断 if (targetRanges.any { value in it }) { // do something }
这里的any函数会遍历集合里的每个Range,只要有一个Range包含value就返回true,和你原来的多条件或逻辑完全一致,可读性还更强。
方案二:封装成扩展函数(更简洁)
如果这个判断逻辑会在多个地方用到,直接给Int类型写个扩展函数会更方便,甚至不用显式定义范围集合:
fun Int.isInTargetRanges(): Boolean { return this in 0..10 || this in 20..30 || this in 40..50 } // 调用的时候直接用: if (value.isInTargetRanges()) { // do something }
这种方式调用起来最简洁,其他开发者看代码的时候,一眼就能明白这个方法的作用,维护成本更低。
补充小提示
如果你的业务场景真的需要编译时常量(其实大部分日常开发场景都不需要),那可能得换个思路,比如把范围转换成数值特征(比如给每个范围映射一个标记位),但这种方式会增加代码复杂度,除非有特殊需求不推荐这么做。
备注:内容来源于stack exchange,提问作者Aethia
相关产品推荐
相关产品推荐

