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.

Mar 29, 2025 - 03:59
 0
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.