DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

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.

Image description

Image description

Image description

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.

EXEMPLOS:
PowerSet e PowerSetDemo.java no repo

Top comments (0)