Chapter 6. Sequences

This chapter looks at Kotlin sequences, which are just like the streams introduced in Java version 1.8. Admittedly that’s a useful statement only if you already know how Java streams work,1 but the recipes in this chapter will highlight both their similarities and their differences.

With collections, processing is eager: when you invoke map or filter on a collection, every element in the collection is processed. Sequences, however, are lazy: when you use a sequence to process data, each element completes the entire pipeline before the next element is processed. This helps when you have a lot of data or if a short-circuiting operation, like first, lets you exit the sequence when a desired value is found.

6.1 Using Lazy Sequences


You want to process the minimum amount of data necessary to satisfy a certain condition.


Use a Kotlin sequence with a short-circuiting function.


Kotlin adds extension functions to basic collections, so that List has functions like map and filter. Those functions are eager, however, meaning that they process every element in the collection.

Consider the following admittedly highly contrived problem: you want to take the numbers from 100 to 200 and double each one, and then find the first double that’s evenly divisible by 3. One way to solve that problem is to use the function in Example 6-1.

Example 6-1. Finding the first double divisible by 3 (version 1)
(100 until 200).map { it * 2 } 
    .filter {

Get Kotlin Cookbook now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.