Sequences vs Collections

Eager vs Lazy

Collection operations (list.map { }.filter { }) are eager: each step processes the whole list and creates a new list. A Sequence is lazy: each element goes through the whole chain one by one, and nothing runs until a terminal operation (toList, first, sum...).

List:      [1,2,3,4] ─map─► [..4 items..] ─filter─► [..] ─first─► result   (2 temporary lists)
Sequence:  1 ─map─filter─✗   2 ─map─filter─✓ first ─► result               (stops early, no lists)

See the Order

Example

fun main() {
    val nums = listOf(1, 2, 3, 4, 5)

    println("List (eager):")
    val a = nums.map { println("  map $it"); it * 10 }
        .filter { println("  filter $it"); it > 20 }
        .first()
    println("  result $a")

    println("Sequence (lazy):")
    val b = nums.asSequence()
        .map { println("  map $it"); it * 10 }
        .filter { println("  filter $it"); it > 20 }
        .first()
    println("  result $b")
}

Output

List (eager):
  map 1
  map 2
  map 3
  map 4
  map 5
  filter 10
  filter 20
  filter 30
  filter 40
  filter 50
  result 30
Sequence (lazy):
  map 1
  filter 10
  map 2
  filter 20
  map 3
  filter 30
  result 30

Comparison

Iterable / ListSequence
Evaluationeager, step by steplazy, element by element
Intermediate collectionsone per operationnone
Can be infinitenoyes
Fast forsmall lists, few operations, need indexesbig data, many chained operations, first/take
Java equivalent-java.util.stream.Stream (sequential)