Lambdas and Streams
Pass behaviour as values: lambdas, functional interfaces, method references, streams, collectors, Optional and parallel streams, down to invokedynamic.
Until Java 8, the only way to hand a piece of behaviour to a method ("sort by this rule", "run this later", "keep only these") was to wrap it in an object, usually an anonymous class of five or more lines. Lambdas made behaviour a value you can write in one line, and streams built on them a way to describe data processing as a pipeline: take these orders, keep the paid ones, group them by city, add up the totals. This phase is where Java code starts to read like a description of *what* you want instead of a list of loop steps.
You'll learn exactly what a lambda is and what it can capture, the functional interfaces in java.util.function, the four kinds of method reference, and then streams from the ground up: how a pipeline is built, why nothing runs until a terminal operation, which operations are stateless, stateful or short-circuiting, how collectors group and summarise data, how Optional replaces null returns, and when parallel streams help or hurt. Every topic also opens the hood: invokedynamic, LambdaMetafactory, spliterators, the fork/join pool.
This phase builds on interfaces and default methods (Topics 5.7–5.8), anonymous classes (Topic 5.13), generics and wildcards (Phase 8) and the collections framework (Phase 9). Concurrency (Phase 13) returns to the fork/join pool behind parallel streams, and many DSA course solutions (/dsa) use the stream idioms you learn here.