Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Reutilizar uma Stream

Estou tentando reutilizar uma Stream com o seguinte código:

Stream lines = Files.lines(origem, StandardCharsets.ISO_8859_1);

Supplier> streamSupplier = () -> lines;

String linhaEncontrada = streamSupplier.get().skip(5 - 1).limit(1).findFirst().orElse(null);

Stream stringStream = streamSupplier.get().filter(line -> !linhaEncontrada.equals(line));

Porém uma Exception está sendo lançada: Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed Eu não consigo reutilizar uma Stream?

3 respostas
solução!

Olá Ana Paula,

é isso mesmo, uma stream só pode ser utilizada uma vez.

Como pode ser visto no javadoc do pacote uma das características de uma Stream é que ela é consumível, ou seja, cada elemento só é visitado uma vez durante a vida de uma Stream, parecido com o comportamento de um Iterator.

Dito isso, a solução é utilizar o Supplier mesmo porém uma nova stream deve ser gerada a cada vez.

No seu código ficaria algo como:

Supplier<Stream<String>> streamSupplier = () -> Files.lines(origem, StandardCharsets.ISO_8859_1);

ao invés de

Stream lines = Files.lines(origem, StandardCharsets.ISO_8859_1);
Supplier<Stream<String>> streamSupplier = () -> lines;

Entendeu a diferença?

Ahh ... entendi! Então sempre que eu precisar "Reutilizar" a stream eu pega com o Suplier get().

Obrigada!

Isso! Sempre cuidando para que o código executado nesse get() gere uma nova Stream ao invés de reutilizar uma antiga.