值范围(Range)与数列(Progression)
Kotlin 允许你非常便利的创建值范围, 方法是使用 kotlin.ranges
包中的 .rangeTo()
和 .rangeUntil()
函数.
如果要创建:
终端封闭(closed-ended)的值范围, 请使用
..
操作符, 调用.rangeTo()
函数.终端开放(open-ended)的值范围, 请使用
..<
操作符, 调用.rangeUntil()
函数.
例如:
值范围非常适合用在 for
循环中遍历:
如果需要按反序遍历整数, 请使用标准库中的 downTo
函数代替 ..
.
还可以使用任意步长(不一定是 1)来遍历整数. 可以通过 step
函数实现.
数列(Progression)
整数类型, 比如 Int
, Long
, 和 Char
, 的值范围, 可以被当作 算数数列(Arithmetic Progression). 在 Kotlin 中, 这些数列由相应的类型来定义: IntProgression
, LongProgression
, 以及 CharProgression
.
数列有 3 个基本属性: first
元素, last
元素, 以及一个非 0 的 step
. 数列的第一个元素就是 first
, 后续的所有元素等于前一个元素加上 step
. 在 step 为正数的数列上的遍历, 等价于 Java/JavaScript 中基于下标的 for
循环:
当你在值范围上遍历时会隐含地创建一个数列, 这个数列的 first
和 last
元素就是值范围的边界值, step
为 1.
如果要自定义数列的步长, 可以在值范围上使用 step
函数.
数列的 last
元素计算方法如下:
如果步长为正: 小于或等于值范围结束值的最大值, 并且满足
(last - first) % step == 0
.如果步长为负: 大于或等于值范围结束值的最小值, 并且满足
(last - first) % step == 0
.
因此, last
元素并不一定等同于值范围中指定的结束值.
数列实现了 Iterable<N>
接口, 这里的 N
分别是 Int
, Long
, 或 Char
, 因此数列可以用于很多 集合函数, 比如 map
, filter
, 等等.