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.