8.6 Conhecendo mais métodos do Stream
Introdução aos Métodos do Stream O capítulo apresenta métodos adicionais da API Stream do Java 8. Nem todos os métodos são cobertos, mas são destacados os mais interessantes. Discutem-se boas práticas no uso de streams. 1. Trabalhando com Iterators Erro ao usar enhanced for com Stream: Stream não implementa Iterable, gerando erro de compilação. Motivo: Streams não podem ser reutilizados após operações terminais (ex: segunda invocação lança IllegalStateException). Uso de Iterator: Obtenção via iterator(): Iterator i = usuarios.stream().iterator(); Método forEachRemaining: Permite percorrer elementos com um Consumer (ex: System.out::println). Quando usar Iterator? Modificar objetos em streams paralelos (evitar efeitos colaterais). Compatibilidade com APIs que exigem Iterator. 2. Testando Predicados Métodos para verificação condicional: anyMatch(Predicate): Verifica se pelo menos um elemento atende ao predicado (ex: usuarios.stream().anyMatch(Usuario::isModerador)). allMatch(Predicate): Verifica se todos os elementos atendem ao predicado. noneMatch(Predicate): Verifica se nenhum elemento atende ao predicado. Eficiência: Processamento interrompido assim que a condição é resolvida (ex: anyMatch para ao encontrar o primeiro moderador). 3. Outros Métodos Úteis Operações básicas: count(): Retorna a quantidade de elementos no Stream. skip(n): Ignora os primeiros n elementos. limit(n)**: Limita o Stream a n` elementos. Criação de Streams: Stream.empty(): Cria um Stream vazio. Stream.of(elementos...): Cria um Stream a partir de elementos (ex: Stream.of(user1, user2)). Stream.concat(stream1, stream2): Concatena dois Streams. Fontes externas: Files.lines(): Stream de linhas de arquivo. Pattern.splitAsStream(): Stream via Regex. Arrays.stream(array): Stream a partir de arrays. 4. Gerenciamento de Recursos Streams e IO: Streams originados de recursos externos (ex: arquivos) implementam AutoCloseable. Obrigatório: Usar try-with-resources ou finally para fechar o Stream. Exemplo: try (Stream lines = Files.lines(Paths.get("arquivo.txt"))) { // processamento } Obs: Streams de coleções não exigem fechamento explícito. 5. Considerações Finais API extensa: A interface Stream possui métodos para diversas necessidades. Recomendação: Explorar a documentação da API para descobrir métodos úteis em cada contexto. Cuidados com streams paralelos: Evitar modificações de estado para garantir resultados determinísticos.

Introdução aos Métodos do Stream
- O capítulo apresenta métodos adicionais da API Stream do Java 8.
- Nem todos os métodos são cobertos, mas são destacados os mais interessantes.
- Discutem-se boas práticas no uso de streams.
1. Trabalhando com Iterators
- Erro ao usar enhanced for com Stream:
- Stream não implementa Iterable, gerando erro de compilação.
Motivo: Streams não podem ser reutilizados após operações terminais (ex: segunda invocação lança IllegalStateException).
Uso de Iterator:
Obtenção via iterator():
Iterator i = usuarios.stream().iterator();
- Método forEachRemaining: Permite percorrer elementos com um Consumer (ex: System.out::println).
Quando usar Iterator?
- Modificar objetos em streams paralelos (evitar efeitos colaterais).
- Compatibilidade com APIs que exigem Iterator.
2. Testando Predicados
Métodos para verificação condicional:
- anyMatch(Predicate): Verifica se pelo menos um elemento atende ao predicado (ex: usuarios.stream().anyMatch(Usuario::isModerador)).
- allMatch(Predicate): Verifica se todos os elementos atendem ao predicado.
- noneMatch(Predicate): Verifica se nenhum elemento atende ao predicado.
- Eficiência: Processamento interrompido assim que a condição é resolvida (ex: anyMatch para ao encontrar o primeiro moderador).
3. Outros Métodos Úteis
Operações básicas:
- count(): Retorna a quantidade de elementos no Stream.
- skip(n): Ignora os primeiros n elementos.
- limit(n)**: Limita o Stream a n` elementos.
Criação de Streams:
- Stream.empty(): Cria um Stream vazio.
- Stream.of(elementos...): Cria um Stream a partir de elementos (ex: Stream.of(user1, user2)).
- Stream.concat(stream1, stream2): Concatena dois Streams.
Fontes externas:
- Files.lines(): Stream de linhas de arquivo.
- Pattern.splitAsStream(): Stream via Regex.
- Arrays.stream(array): Stream a partir de arrays.
4. Gerenciamento de Recursos
Streams e IO:
- Streams originados de recursos externos (ex: arquivos) implementam AutoCloseable.
- Obrigatório: Usar try-with-resources ou finally para fechar o Stream. Exemplo:
try (Stream
// processamento
}
Obs: Streams de coleções não exigem fechamento explícito.
5. Considerações Finais
- API extensa: A interface Stream possui métodos para diversas necessidades.
- Recomendação: Explorar a documentação da API para descobrir métodos úteis em cada contexto.
- Cuidados com streams paralelos: Evitar modificações de estado para garantir resultados determinísticos.