View source on GitHub

Module 14 - Streams API

What You Will Learn

Category Operations
Creating streams Collection.stream(), Stream.of(), Stream.generate(), Stream.iterate(), IntStream.range()
Intermediate (lazy) filter, map, flatMap, distinct, sorted, peek, limit, skip, mapToInt/Long/Double
Terminal (eager) collect, forEach, count, reduce, findFirst/Any, anyMatch/allMatch/noneMatch, min/max, toArray
Collectors toList, toSet, toMap, groupingBy, partitioningBy, joining, counting, summarizingInt, teeing
Primitive streams IntStream, LongStream, DoubleStream - sum, average, range, rangeClosed

The Pipeline Model

Source → [Intermediate ops (lazy)] → Terminal op (triggers execution)

list.stream()          // source
    .filter(...)       // lazy - nothing runs yet
    .map(...)          // lazy - nothing runs yet
    .collect(...)      // terminal - pipeline executes NOW

Intermediate vs Terminal

INTERMEDIATE (return Stream<T>)    TERMINAL (return a value or void)
──────────────────────────────     ─────────────────────────────────
filter(Predicate)                  collect(Collector)
map(Function)                      forEach(Consumer)
flatMap(Function)                  count()
distinct()                         reduce(identity, BinaryOperator)
sorted([Comparator])               findFirst() / findAny()
peek(Consumer)                     anyMatch / allMatch / noneMatch
limit(long)                        min(Comparator) / max(Comparator)
skip(long)                         toList()   (Java 16+)
mapToInt/Long/Double               toArray()

Collectors Cheat Sheet

// Basic collectors
Collectors.toList()                      → List<T>
Collectors.toSet()                       → Set<T>
Collectors.toUnmodifiableList()          → unmodifiable List<T>
Collectors.joining(", ", "[", "]")       → String
Collectors.counting()                    → Long
Collectors.toMap(keyFn, valueFn)         → Map<K,V>

// Grouping
Collectors.groupingBy(classifier)        → Map<K, List<T>>
Collectors.groupingBy(classifier, downstream)
Collectors.partitioningBy(predicate)     → Map<Boolean, List<T>>

// Statistics
Collectors.summarizingInt(fn)            → IntSummaryStatistics
Collectors.averagingInt(fn)              → Double
Collectors.summingInt(fn)                → Integer

// Composing (Java 12+)
Collectors.teeing(c1, c2, merger)        → merges results of two collectors

Source Files

File What it Demonstrates
StreamBasics.java Creating streams, filter/map/sorted/limit/skip, terminal ops, Optional from streams
CollectorsDeep.java groupingBy, partitioningBy, toMap, joining, summarizingInt, teeing, downstream collectors
PrimitiveStreams.java IntStream/LongStream/DoubleStream, boxing/unboxing, range/rangeClosed, statistics
StreamPatterns.java flatMap, lazy evaluation, generate/iterate, real-world pipelines

Running

cd module-14-streams
mvn test