Item 47: Dê preferência à Collection como um tipo de retorno em vez da Stream

Preferência por Collection:

  • Em métodos que retornam sequências de elementos, dê preferência a Collection como tipo de retorno em vez de Stream.
  • Collection permite iteração com loops for-each e processamento com streams, oferecendo maior flexibilidade para os usuários.

Interfaces de Retorno Comuns:

  • Antes do Java 8, Collection, Set, List, Iterable e arrays eram os tipos de retorno mais comuns.
  • Iterable era usada para iteração simples e arrays para valores primitivos ou sequências com requisitos de execução rigorosos.

Impacto do Java 8:

  • A introdução das streams no Java 8 complicou a escolha do tipo de retorno adequado.
  • Apesar das streams, a iteração com loops for-each continua relevante e importante.

Problemas com Streams:

  • Se uma API retorna apenas uma stream, usuários que preferem iteração com loops for-each ficam frustrados.
  • Stream não estende Iterable, dificultando o uso em loops for-each.

Soluções para Iteração em Streams:

  • Não há uma solução ideal para adaptar streams para iteração direta.
  • Pode-se escrever métodos adaptadores, mas o código resultante é muitas vezes confuso e menos eficiente.

Retornando Sequências:

  • Se a sequência será usada apenas em streams, retornar uma Stream é adequado.
  • Se a sequência será usada apenas para iteração, retorne uma Iterable.
  • Para APIs públicas, que precisam atender ambos os casos, Collection ou um subtipo é geralmente a melhor escolha.

Uso de Coleções Especiais:

  • Se a sequência for grande demais para ser armazenada na memória, considere implementar uma coleção customizada.
  • Por exemplo, para representar conjuntos potência, uma coleção customizada pode ser mais adequada.

Trade-offs de Implementação:

  • Em alguns casos, pode ser mais fácil implementar uma stream do que uma coleção customizada.
  • No entanto, streams não são sempre a melhor solução, especialmente quando a iteração seria mais natural.

Considerações de Desempenho:

  • Implementações customizadas de Collection podem ser mais rápidas que streams, mas são mais verbosas.
  • Adaptadores de Stream para Iterable podem impactar negativamente o desempenho.

Conclusão:

  • Ao retornar uma sequência de elementos, considere as necessidades dos usuários de streams e iteração.
  • Retorne uma Collection sempre que possível, e use streams ou iteradores apenas quando necessário.
  • Uma futura extensão de Stream para Iterable pode resolver algumas dessas questões.

Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top
Cloudy | #1 secure, private, and affordable online storage solutions. How to install docker and docker compose on ubuntu 20. Privacy, cookie & data policy.