首页 > 解决方案 > Kotlin - 当使用 .. 创建范围或它如何执行比较时会发生什么?

问题描述

我最近注意到一个代码重构来自:

   if (date < minDate || date > maxDate)

if (date !in minDate..maxDate) 

我主要担心的是,使用范围会创建一个“数组”或某个列表,其中包含和之间的所有毫秒minDatemaxDate

我尝试研究一些 kotlin 内部结构,但无法得到关于该案例会发生什么的最终答案。

据说:

在 Kotlinin中,检查被转换为相应的contains 调用

标签: kotlinrangeconditional-statementslong-integer

解决方案


不,它不会创建一个包含所有可能值的数组(因为数组对此效率低下,即使我们确实需要存储每个值,但我们不需要)。

这是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).


推荐阅读