2
respostas

[Dúvida] Formulação de streams com terminal operations consecutivas

No seguinte código do exercício Armazenando dados em um Set na aula 04:

transacoes.stream()
 .filter(t -> t.getValor() > 5000)
 .peek(System.out::println)
 .collect(Collectors.toSet()).stream()
 .findFirst();

Há duas operações finais consecutivas, separadas pela chamada de um novo stream(), neste caso então, quando eu quiser continuar meu fluxo de stream() utilizando operações finais, eu posso fazer isso apenas chamando novamente o método stream() ?

E isso deve-se porque toda operação intermediária tem um retorno do tipo Stream, enquanto que operações finais possuem retornos diferentes de Stream?

2 respostas

Olá! Espero que você esteja indo bem em seus estudos de Java.

Você está no caminho certo em sua compreensão sobre operações intermediárias e finais em streams. No código que você compartilhou, a operação collect(Collectors.toSet()) é uma operação terminal. Isso significa que ela processa o stream e retorna um resultado que não é mais um stream, no caso, um Set.

Quando você deseja continuar processando os dados como um stream após uma operação terminal, como você fez ao chamar .stream() novamente, você está essencialmente criando um novo stream a partir do Set que foi coletado. Isso é possível porque o Set é uma coleção e você pode obter um stream a partir de qualquer coleção em Java.

A razão pela qual isso funciona é que operações intermediárias, como filter e peek, retornam um stream, permitindo que você encadeie mais operações. Já as operações finais, como collect e findFirst, não retornam um stream, mas sim um resultado concreto, como um Set ou um elemento opcional.

Portanto, sim, para continuar trabalhando com os dados usando streams após uma operação terminal, você pode chamar stream() novamente na coleção resultante, como fez no seu exemplo. Isso é bastante comum quando você precisa realizar mais processamento após uma operação terminal que transforma o stream em uma coleção.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Exatamente, as operações intermediárias retornam stream, então você pode ir encadeando, já .collect(Collectors.toSet()) retorna um set, por isso precisa abrir uma nova stream para continuar acrescentando operações