Mentre sviluppo la mia API che non è legata ad alcun codice legacy, mi trovo spesso a scrivere metodi che sono puramente flussi di pipeline terminati raccogliendo i risultati. Come questo:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Ora, la maggior parte dei client di questa classe di solito avrà bisogno della Collection (in questo caso, un ImmutableSet) per cercare elementi e iterare su di esso, ma alcuni client potrebbero trarre vantaggio dall'avere uno Stream in modo da poter eseguire il pipe di alcune operazioni in più Streaming senza la necessità di ottenere un nuovo stream dalla raccolta. Quindi la restituzione di uno Stream offre ai clienti un superset di opzioni che avrebbero se avessero la Collezione (dopo tutto, possono sempre collect()
lo Stream stesso:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Questo approccio mi sta tentando di provare perché non vedo alcun potenziale difetto che potrebbe avere. Tuttavia, non ho mai visto questo approccio in nessuna libreria (probabilmente perché non c'erano molte librerie rilasciate dopo l'apparizione di Java 8), quindi ho un po 'paura di adottarlo. Le classi di biblioteche esistenti di solito restituiscono Raccolte quando derivano qualcosa dallo stato privato.
C'è qualcosa di brutto che potrebbe accadere se decido di restituire uno Stream ovunque il mio io pre-Java-8 restituisca una Collezione? O probabilmente sto facendo qualcosa di antipatico qui con tutto ciò che deriva dallo stato privato?