8.7 Streams primitivos e infinitos

Resumo: Streams primitivos e infinitos

1. Streams Primitivos

  • Objetivo: Evitar boxing/unboxing desnecessários, melhorando desempenho.

Tipos disponíveis:

  • IntStream, LongStream, DoubleStream.

Iteradores especializados:

  • Exemplo: PrimitiveIterator.OfInt (retorna int com nextInt(), além de next() para Integer).

Métodos úteis:

  • range(inicio, fim): Gera sequência de números (ex: IntStream.range(0, 10)).
  • mapToInt, mapToLong, mapToDouble: Convertem Stream para streams primitivos.
  • boxed(): Converte um stream primitivo para Stream (ex: IntStream.generate(…).boxed()).

2. Streams Infinitos

Criação via Supplier:
Stream.generate(Supplier): Gera elementos indefinidamente (ex: números aleatórios).

IntStream.generate(() -> random.nextInt())  

Enter fullscreen mode Exit fullscreen mode

Stream.iterate(seed, UnaryOperator): Gera sequências com base em um valor inicial (ex: números naturais).

IntStream.iterate(0, x -> x + 1)  

Enter fullscreen mode Exit fullscreen mode

Operações de curto-circuito:

  • limit(n): Limita o stream a n elementos (ex: .limit(10)).
  • findFirst(): Retorna o primeiro elemento que atende a uma condição (ex: .filter(f -> f > 100).findFirst()).
  • anyMatch, allMatch, noneMatch: Interrompem o processamento assim que a condição é resolvida.

4. Cuidados e Observações

Streams infinitos exigem operações de curto-circuito:

  • Sem limit, findFirst ou anyMatch, operações como sum() ou collect() podem não terminar.
  • Exemplo perigoso: allMatch(f -> f % 2 == 0) em um stream infinito de Fibonacci (pode rodar indefinidamente).

Estado em Suppliers:

  • Lambdas não permitem variáveis mutáveis. Para manter estado, use classes ou interfaces funcionais com atributos (ex: Fibonacci).
  • Estado pode limitar paralelização, pois streams paralelos processam elementos de forma não sequencial.

APIs existentes:

  • Random.ints(): Retorna um IntStream infinito de números aleatórios.
  • Files.lines(), Pattern.splitAsStream(): Fontes alternativas para streams.

5. Vantagens e Aplicações

  • Eficiência: Streams primitivos evitam overhead de boxing.
  • Flexibilidade: Streams infinitos permitem modelar sequências ilimitadas (ex: dados em tempo real, séries matemáticas).
  • Integração com APIs: Métodos como limit e findFirst facilitam o trabalho com grandes volumes de dados.

Ver exemplos práticos: StreamPrimitivosInfinitosTest

原文链接:8.7 Streams primitivos e infinitos

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容