Ranges and progressions
Kotlin lets you easily create ranges of values using the .rangeTo() and .rangeUntil() functions from the kotlin.ranges package.
To create:
a closed-ended range, call the
.rangeTo()function with the..operator.an open-ended range, call the
.rangeUntil()function with the..<operator.
For example:
Ranges are particularly useful for iterating over for loops:
To iterate numbers in reverse order, use the downTo function instead of ...
It is also possible to iterate over numbers with an arbitrary step (not necessarily 1). This is done via the step function.
Progression
The ranges of integral types, such as Int, Long, and Char, can be treated as arithmetic progressions. In Kotlin, these progressions are defined by special types: IntProgression, LongProgression, and CharProgression.
Progressions have three essential properties: the first element, the last element, and a non-zero step. The first element is first, subsequent elements are the previous element plus a step. Iteration over a progression with a positive step is equivalent to an indexed for loop in Java/JavaScript.
When you create a progression implicitly by iterating a range, this progression's first and last elements are the range's endpoints, and the step is 1.
To define a custom progression step, use the step function on a range.
The last element of the progression is calculated this way:
For a positive step: the maximum value not greater than the end value such that
(last - first) % step == 0.For a negative step: the minimum value not less than the end value such that
(last - first) % step == 0.
Thus, the last element is not always the same as the specified end value.
Progressions implement Iterable<N>, where N is Int, Long, or Char respectively, so you can use them in various collection functions like map, filter, and other.