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
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
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)