Durante lo sviluppo della mia API che non è legata a nessun codice legacy, mi trovo spesso a scrivere metodi che sono stati interrotti esclusivamente dalla pipeline di Streams 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 hanno bisogno della Collection (in questo caso, un ImmutableSet) per cercare elementi e scorrere su di essa, ma alcuni client possono trarre vantaggio dall'avere un Stream così potrebbero reindirizzare alcune operazioni su quel flusso senza la necessità di ottenere un nuovo flusso dalla raccolta. Quindi restituire un flusso dà ai cliens un superset di opzioni che avrebbero se avessero appena la collezione (dopotutto, possono sempre collect()
del flusso 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 libreria esistenti in genere restituiscono le raccolte quando ricavano qualcosa dallo stato privato.
C'è qualcosa di brutto che potrebbe accadere se decido di restituire un flusso ovunque il mio sé pre-Java-8 restituisca una raccolta? O probabilmente sto facendo qualcosa di antipattern qui con tutto ciò che deriva dallo stato privato?