值范围(Range)与数列(Progression)
在 Kotlin 中, 值范围(Range)与数列(Progression)用来定义值的序列, 支持范围操作符, 迭代, 自定义步长值, 以及算数数列.
值范围(Range)
Kotlin 允许你非常便利的创建值范围, 方法是使用 kotlin.ranges 包中的 .rangeTo() 和 .rangeUntil() 函数.
值范围表示一组有序的值, 具有指定的起始值和结束值. 默认情况下, 值范围的增长步长为 1. 例如, 1..4 表示数字 1, 2, 3, 和 4.
如果要创建:
终端封闭(closed-ended)的值范围, 请使用
..操作符, 调用.rangeTo()函数. 这个值范围包含起始值和结束值.终端开放(open-ended)的值范围, 请使用
..<操作符, 调用.rangeUntil()函数. 这个值范围包含起始值, 但不包含结束值.
例如:
值范围非常适合用在 for 循环中遍历:
如果需要按反序遍历整数, 请使用标准库中的 downTo 函数代替 ...
你也可以使用 step() 函数, 用自定义的步长遍历整数, 而不是默认步长 1:
数列(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, 等等.