Streams use lazy evaluation—intermediate operations create a pipeline but don't execute until a terminal operation is called. This allows for optimization and avoids unnecessary computation.
List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve");
// This creates the pipeline but doesn't execute yet
Stream<String> filteredStream = names.stream()
.filter(name -> {
System.out.println("Filtering: " + name);
return name.startsWith("J");
});
// Terminal operation - NOW the pipeline executes
filteredStream.count(); // Prints "Filtering: " messages