概述
在Kotlin的标准库中提供了ClosedRange
整数性的值范围
任何可比较大小的数据类型(comparable type)都可以定义值范围, 但对于整数性的基本类型, 在Kotlin中做了特殊的优化。在标准库中,定义了 IntRange , LongRange , CharRange等3个Range,我们可以直接使用。可以对这些值范围进行遍历. 编译器会负责将这些代码变换为 Java 中基于下标的 for 循环, 不会产生不必要的性能损耗.
for (i in 1..4) print(i) // 打印结果为: "123
值范围不仅能够按需便利,还能够反序遍历。如果反序遍历整数,那就得调用扩展函数downTo了:
for (i in 4 downTo 1) print(i) // 打印结果为: "4321"
如果你觉得值范围,就这些功能你就错了,它还能控制不长,也就是说间隔多少个遍历,step()函数可以你实现:
for (i in 1..4 step 2) print(i) // 打印结果为: "13"
for (i in 4 downTo 1 step 2) print(i) // 打印结果为: "42"
工具函数
rangeTo
class Int {
//...
operator fun rangeTo(other: Long): LongRange = LongRange(this, other)
//...
operator fun rangeTo(other: Int): IntRange = IntRange(this, other)
//...
}
在Int类型中,定义了扩展函数用来定义值范围,其实际上是在扩展函数中调用了相应的*Range类,返回了*Range的对象。
val range = 1.rangeTo(5)
for (i in range) {
println(i)
}
range.forEach (::println)
浮点型数值( Double , Float ) 没有定义自己的 rangeTo 操作符, 而是使用标准库为共通的Comparable类型提供的操作符:
public operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T>
这个函数返回的值范围不能用来遍历。
downTo()
fun Long.downTo(other: Int): LongProgression {
return LongProgression.fromClosedRange(this, other, -1.0)
}
fun Byte.downTo(other: Int): IntProgression {
return IntProgression.fromClosedRange(this, other, -1)
}
downTo() 扩展函数可用于一对整数类型值,用于生成倒叙的序列。
val range = 4.downTo(1)
for (item in range) {
print(item) // Log: 4321
}
step()
对每个 *Progression 类都定义了 step() 扩展函数, 所有这些函数都会返回使用新 step 值(由函数参数指定)的数列. 步长值参数要求永远是正数, 因此这个函数不会改变数列遍历的方向.
fun IntProgression.step(step: Int): IntProgression {
if (step <= 0) throw IllegalArgumentException("Step must be positive, was: $step")
return IntProgression.fromClosedRange(first, last, if (increment > 0) step else -step)
}
fun CharProgression.step(step: Int): CharProgression {
if (step <= 0) throw IllegalArgumentException("Step must be positive, was: $step")
return CharProgression.fromClosedRange(first, last, step)
}
注:
函数返回的数列的 last 值可能会与原始数列的 last 值不同, 这是为了保证 (last - first) %increment == 0 原则.
1..12 step 2).last == 11 // 数列中的元素为 [1, 3, 5, 7, 9, 11]
(1..12 step 3).last == 10 // 数列中的元素为 [1, 4, 7, 10]
(1..12 step 4).last == 9 // 数列中的元素为 [1, 5

Kotlin提供ClosedRange,针对整数类型如IntRange, LongRange, CharRange进行了优化,支持遍历、反序遍历(通过downTo())和自定义步长(通过step())操作。值范围的创建可以通过rangeTo扩展函数,而浮点数使用通用的Comparable类型操作符。注意,downTo()和step()可能改变数列的last值以保持增量规律。"
134939529,14200632,全屏自适应百叶窗动画切换JS实现,"['JavaScript', '前端框架', 'CSS3动画', '网页特效', '动效开发']
1185

被折叠的 条评论
为什么被折叠?



