Skip to main content

Exploring Kotlin's Ranges and Progressions

· 7 min read
Engineering Team

This tutorial will explore Kotlin's ranges and progressions, explaining their usefulness and providing detailed code examples. Ranges and progressions are powerful tools in Kotlin that allow developers to work with sequences of values and perform operations on them efficiently.

exploring kotlins ranges progressions loops functions extensions

Introduction​

Ranges and progressions in Kotlin are used to represent a sequence of values between two endpoints. Ranges are defined using the range operator (..), while progressions are defined using the range operator along with additional functions like step() and downTo().

What are Ranges and Progressions?​

Ranges in Kotlin represent a sequence of values between two endpoints. The range can be either inclusive or exclusive. Inclusive ranges include both endpoints, while exclusive ranges include the start point but exclude the end point. Progressions, on the other hand, are a way to define a sequence of values that follow a specific pattern, such as arithmetic or geometric progressions.

Why are they useful in Kotlin?​

Ranges and progressions provide a concise and expressive way to work with sequences of values in Kotlin. They are particularly useful when iterating over a range of values or performing operations on a sequence of numbers. Ranges and progressions can also be used in combination with loops and other control flow structures to perform complex calculations and generate sequences of values dynamically.

Range Operators​

Kotlin provides two range operators: the closed range operator (..) and the half-open range operator (until()).

Closed Range Operator​

The closed range operator (..) is used to create a range that includes both the start and end points. Here's an example:

val range = 1..5

In this example, range represents the sequence of values from 1 to 5, inclusive.

Half-Open Range Operator​

The half-open range operator (until()) is used to create a range that includes the start point but excludes the end point. Here's an example:

val range = 1 until 5

In this example, range represents the sequence of values from 1 to 4. The end point, 5, is excluded from the range.

Using Ranges in Loops​

Ranges can be used in loops to iterate over a sequence of values. Here's an example:

for (i in 1..5) {
println(i)
}

This loop will iterate over the values in the range from 1 to 5, inclusive, and print each value on a new line.

Progressions​

Progressions in Kotlin are used to define a sequence of values that follow a specific pattern. There are two types of progressions: arithmetic progressions and geometric progressions.

Arithmetic Progressions​

Arithmetic progressions are defined by a starting value, a common difference, and an end value. Kotlin provides the step() function to define the common difference. Here's an example:

val progression = 1..10 step 2

In this example, progression represents the arithmetic progression from 1 to 10 with a step size of 2. The sequence of values will be 1, 3, 5, 7, 9.

Geometric Progressions​

Geometric progressions are defined by a starting value, a common ratio, and an end value. Kotlin provides the step() function to define the common ratio. Here's an example:

val progression = 1..10 step 2

In this example, progression represents the geometric progression from 1 to 10 with a step size of 2. The sequence of values will be 1, 2, 4, 8.

Using Progressions in Loops​

Progressions can be used in loops to iterate over a sequence of values. Here's an example:

for (i in 1..10 step 2) {
println(i)
}

This loop will iterate over the values in the arithmetic progression from 1 to 10 with a step size of 2, and print each value on a new line.

Range and Progression Functions​

In addition to the range and progression operators, Kotlin provides several functions to work with ranges and progressions.

rangeTo() function​

The rangeTo() function is used to create a range between two values. Here's an example:

val range = rangeTo(1, 5)

In this example, range represents the sequence of values from 1 to 5, inclusive.

downTo() function​

The downTo() function is used to create a range in reverse order. Here's an example:

val range = 5 downTo 1

In this example, range represents the sequence of values from 5 to 1, inclusive.

step() function​

The step() function is used to define the step size for a progression. Here's an example:

val progression = 1..10 step 2

In this example, progression represents the arithmetic progression from 1 to 10 with a step size of 2.

until() function​

The until() function is used to create a half-open range. Here's an example:

val range = 1 until 5

In this example, range represents the sequence of values from 1 to 4. The end point, 5, is excluded from the range.

Range and Progression Extensions​

Kotlin also provides extension functions for ranges and progressions, which allow for additional functionality and flexibility.

rangeTo() extension​

The rangeTo() extension function is used to create a range between two values. Here's an example:

val range = 1.rangeTo(5)

In this example, range represents the sequence of values from 1 to 5, inclusive.

downTo() extension​

The downTo() extension function is used to create a range in reverse order. Here's an example:

val range = 5.downTo(1)

In this example, range represents the sequence of values from 5 to 1, inclusive.

step() extension​

The step() extension function is used to define the step size for a progression. Here's an example:

val progression = 1.rangeTo(10).step(2)

In this example, progression represents the arithmetic progression from 1 to 10 with a step size of 2.

until() extension​

The until() extension function is used to create a half-open range. Here's an example:

val range = 1.until(5)

In this example, range represents the sequence of values from 1 to 4. The end point, 5, is excluded from the range.

Range and Progression Examples​

Here are a few examples to demonstrate the usage of ranges and progressions in Kotlin.

Iterating over a Range​

for (i in 1..5) {
println(i)
}

This loop will iterate over the values in the range from 1 to 5, inclusive, and print each value on a new line.

Generating a Fibonacci Sequence​

fun fibonacci(n: Int): Int {
return when (n) {
0 -> 0
1 -> 1
else -> fibonacci(n - 1) + fibonacci(n - 2)
}
}

val sequence = 0.until(10).map { fibonacci(it) }
println(sequence)

In this example, the fibonacci() function is used to generate the Fibonacci sequence up to the 10th element. The map() function is used to apply the fibonacci() function to each element in the range, resulting in a sequence of Fibonacci numbers.

Skipping Elements in a Range​

val range = 1..10 step 2
val filteredRange = range.filter { it % 3 == 0 }
println(filteredRange)

In this example, the filter() function is used to skip elements in the range that are not divisible by 3. The resulting range will only include values that satisfy the given condition.

Conclusion​

In this tutorial, we explored Kotlin's ranges and progressions. We learned how to create ranges and progressions using the range operators and functions provided by Kotlin. We also saw how to use ranges and progressions in loops and perform operations on them. Ranges and progressions are powerful tools in Kotlin that can greatly simplify working with sequences of values. By leveraging these features, developers can write more concise and expressive code.

Practical product notes

Get the next useful guide

Occasional tutorials, product resources, and lessons from building and launching software.