Streams do Java: preguiça e operações terminais
Pergunta
Como funciona uma `Stream` do Java em termos de avaliação, e qual a diferença entre operação intermediária e terminal?
Resposta esperada
Operações intermediárias (`filter`, `map`, `sorted`, `distinct`) são preguiçosas: elas montam o pipeline mas não processam nada — retornam uma nova Stream. O trabalho só acontece quando uma operação TERMINAL é chamada (`collect`, `forEach`, `reduce`, `count`, `findFirst`, `anyMatch`). Nesse momento, os elementos fluem pelo pipeline geralmente um a um (não 'faz todo o filter, depois todo o map'), o que permite curto-circuito (`findFirst` para no primeiro que serve, sem processar o resto) e trabalhar com streams infinitas. Pegadinhas: uma Stream é de uso único (consumiu, acabou — reusar dá `IllegalStateException`); `peek` é pra debug, não pra efeito colateral; e o lambda de uma operação não deve mutar estado externo (quebra em `parallelStream`). `parallel()` só compensa com muito dado e operação cara, e nunca com ordem/efeito colateral importando.
Por que perguntam isso
Pergunta pleno de Java. Paralelo com LINQ lazy do C#. Sinal bom: curto-circuito, uso único, e cuidado com parallelStream.