Ao desenvolver minha API que não está vinculada a nenhum código legado, muitas vezes me pego escrevendo métodos que são puramente pipeline do Streams encerrados coletando os resultados. Como este:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Agora, a maioria dos clientes dessa classe geralmente precisará da Collection (neste caso, um ImmutableSet) para pesquisar elementos e iterar sobre ela, mas alguns clientes podem se beneficiar de ter um Stream para poder canalizar mais algumas operações sobre isso. Transmita sem a necessidade de obter um novo fluxo da Coleção. Portanto, retornar um Stream dá aos clientes um superconjunto de opções que eles teriam se tivessem apenas a Coleção (afinal, eles sempre podem collect()
o Stream:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Essa abordagem é tentadora para eu experimentar, pois não vejo nenhuma falha em potencial que possa ter. No entanto, nunca vi essa abordagem em nenhuma biblioteca (provavelmente porque não havia muitas bibliotecas lançadas após o aparecimento do Java 8), por isso tenho um pouco de medo de adotá-la. As classes de biblioteca existentes geralmente retornam Coleções quando derivam algo do estado privado.
Existe algo de ruim que poderia acontecer se eu decidisse retornar um Stream sempre que meu eu pré-Java-8 retornasse uma Coleção? Ou provavelmente estou fazendo algo antipadrão aqui com tudo isso derivado do estado privado?