kotlin - Kotlin - 当使用 .. 创建范围或它如何执行比较时会发生什么?
问题描述
我最近注意到一个代码重构来自:
if (date < minDate || date > maxDate)
到
if (date !in minDate..maxDate)
我主要担心的是,使用范围会创建一个“数组”或某个列表,其中包含和之间的所有毫秒数minDate
maxDate
我尝试研究一些 kotlin 内部结构,但无法得到关于该案例会发生什么的最终答案。
据说:
在 Kotlin
in
中,检查被转换为相应的contains
调用
解决方案
不,它不会创建一个包含所有可能值的数组(因为数组对此效率低下,即使我们确实需要存储每个值,但我们不需要)。
这是ClosedRange
接口的源代码,..
范围运算符将其转换为(已删除注释):
public interface ClosedRange<T: Comparable<T>> {
public val start: T
public val endInclusive: T
public fun isEmpty(): Boolean = start > endInclusive
public operator fun contains(value: T): Boolean =
value >= start && value <= endInclusive
}
如您所见,它所覆盖的类型 ( T
) 必须实现Comparable<T>
。这允许实现对范围进行value
直接start
比较endInclusive
。您可以在contains(value: T)
.
推荐阅读
- python - Python 给出已定义的名称错误
- c# - ViewBag 不保存状态
- swift4 - 在 swift 4 迁移中出现模棱两可的错误
- oracle - 与双重合并在 12c 中不起作用
- influxdb - InfluxDB - 使用聚合函数 DIFFERENCE() 的查询,从其他查询返回值
- spring-boot - 如何使用 gradle 将时间戳附加到生成的 jar 中?
- java - jenkins如何使用maven deploy url?
- google-sheets - 如何在 Google 表格中一次对所有表格使用一种条件格式?
- hadoop - 当 HDFS 已经提供数据存储时,为什么要使用 Hive?
- javascript - 捆绑多个js文件