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

如何用常量存储多段数值范围以简化条件判断?

如何用常量存储多段数值范围以简化条件判断?

我来帮你捋清楚这个问题~你之前的写法之所以报错,是踩了两个小坑:一是用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:09:51