# 值范围(Range)与数列(Progression) 在 Kotlin 中, 值范围(Range)与数列(Progression)用来定义值的序列, 支持范围操作符, 迭代, 自定义步长值, 以及算数数列. ## 值范围(Range) Kotlin 允许你非常便利的创建值范围, 方法是使用 `kotlin.ranges` 包中的 [.rangeTo()](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/range-to.html) 和 [.rangeUntil()](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/range-until.html) 函数. 值范围表示一组有序的值, 具有指定的起始值和结束值. 默认情况下, 值范围的增长步长为 1. 例如, `1..4` 表示数字 1, 2, 3, 和 4. 如果要创建: * 终端封闭(closed-ended)的值范围, 请使用 `..` 操作符, 调用 `.rangeTo()` 函数. 这个值范围包含起始值和结束值. * 终端开放(open-ended)的值范围, 请使用 `..<` 操作符, 调用 `.rangeUntil()` 函数. 这个值范围包含起始值, 但不包含结束值. 例如: ```KOTLIN fun main() { //sampleStart // 终端封闭的值范围: 包含 1 和 4 println(4 in 1..4) // 输出结果为: true // 终端开放的值范围: 包含 1, 不包含 4 println(4 in 1..<4) // 输出结果为: false //sampleEnd } ``` 值范围非常适合用在 `for` 循环中遍历: ```KOTLIN fun main() { //sampleStart for (i in 1..4) print(i) // 输出结果为: 1234 //sampleEnd } ``` 如果需要按反序遍历整数, 请使用标准库中的 [downTo](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/down-to.html) 函数代替 `..`. ```KOTLIN fun main() { //sampleStart for (i in 4 downTo 1) print(i) // 输出结果为: 4321 //sampleEnd } ``` 你也可以使用 [step()](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/step.html) 函数, 用自定义的步长遍历整数, 而不是默认步长 1: ```KOTLIN fun main() { //sampleStart for (i in 0..8 step 2) print(i) println() // 输出结果为: 02468 for (i in 0..<8 step 2) print(i) println() // 输出结果为: 0246 for (i in 8 downTo 0 step 2) print(i) // 输出结果为: 86420 //sampleEnd } ``` ## 数列(Progression) 整数类型, 比如 `Int`, `Long`, 和 `Char`, 的值范围, 可以被当作 [算数数列(Arithmetic Progression)](https://en.wikipedia.org/wiki/Arithmetic_progression). 在 Kotlin 中, 这些数列由相应的类型来定义: [IntProgression](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-int-progression/index.html), [LongProgression](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-long-progression/index.html), 以及 [CharProgression](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-char-progression/index.html). 数列有 3 个基本属性: `first` 元素, `last` 元素, 以及一个非 0 的 `step`. 数列的第一个元素就是 `first`, 后续的所有元素等于前一个元素加上 `step`. 在 step 为正数的数列上的遍历, 等价于 Java/JavaScript 中基于下标的 `for` 循环: ```JAVA for (int i = first; i <= last; i += step) { // ... } ``` 当你在值范围上遍历时会隐含地创建一个数列, 这个数列的 `first` 和 `last` 元素就是值范围的边界值, `step` 为 1. ```KOTLIN fun main() { //sampleStart for (i in 1..10) print(i) // 输出结果为: 12345678910 //sampleEnd } ``` 如果要自定义数列的步长, 可以在值范围上使用 `step` 函数. ```KOTLIN fun main() { //sampleStart for (i in 1..8 step 2) print(i) // 输出结果为: 1357 //sampleEnd } ``` 数列的 `last` 元素计算方法如下: * 如果步长为正: 小于或等于值范围结束值的最大值, 并且满足 `(last - first) % step == 0`. * 如果步长为负: 大于或等于值范围结束值的最小值, 并且满足 `(last - first) % step == 0`. 因此, `last` 元素并不一定等同于值范围中指定的结束值. ```KOTLIN fun main() { //sampleStart for (i in 1..9 step 3) print(i) // last 元素是 7 // 输出结果为: 147 //sampleEnd } ``` 数列实现了 `Iterable` 接口, 这里的 `N` 分别是 `Int`, `Long`, 或 `Char`, 因此数列可以用于很多 [集合函数](collection-operations.html), 比如 `map`, `filter`, 等等. ```KOTLIN fun main() { //sampleStart println((1..10).filter { it % 2 == 0 }) // 输出结果为: [2, 4, 6, 8, 10] //sampleEnd } ```