Scrivendo applicazioni in Java esistono molti casi d'uso per java.util.Collection
. Poiché java.util.stream.Stream
è stato introdotto con Java 8, ho trovato alcuni casi d'uso in cui è difficile decidere cosa utilizzare.Decisione tra l'uso di uno stream o di un loop
Ad esempio: Scriverete alcuni metodi di utilizzo.
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
return toFilter.stream()
.filter((Object o) -> hash == o.hashCode())
.collect(Collectors.toCollection(LinkedList::new));
}
Che a scrivere in questo modo:
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
List<Object> result = new LinkedList<>();
for(Object o : toFilter) {
if(hash == o.hashCode()) {
result.add(o);
}
}
return result;
}
Entrambi i metodi produrrebbe lo stesso risultato. java.util.stream.Stream
e java.util.stream.Collector
sono interfacce, quindi l'implementazione può variare anche se utilizzo flussi e collettori personalizzati.
Penso che ci siano un sacco di implementazioni là fuori usando il loop-way old-fashoined.
Quindi, è possibile rispondere a cosa utilizzare, streaming o loop, da use-case? E se sì, tutte le implementazioni devono essere aggiornate dove appropriato?
O dovrei anche fornire entrambi i modi implementando metodi di utilizzo? O dovrei anche fornire un mthed per restituire il flusso dopo il processo di filtraggio in modo da poter lavorare anche con quello, se necessario?
È possibile avere un parallelismo molto semplice con gli Stream, sono più compatti (alcuni potrebbero essere più "leggibili") e hanno ulteriori vantaggi, se i flussi sono veri "flussi" (qualcosa scorre, dinamicamente - non basato su un raccolta fissa come qui). Ma nel tuo caso particolare, penso che potresti andare in entrambi i modi. – mastov
Quindi possiamo accorciare a: Gli stream devono essere preferibili, ma in casi di facile utilizzo entrambi vanno bene? – narranoid
Vorrei usare due semplici regole: 1. se non è rotto, non aggiustarlo. 2. usa quello che trovi più leggibile e manutenibile. Detto questo, i tuoi due esempi non restituiscono la stessa cosa: uno restituisce un oggetto ArrayList e l'altro restituisce un oggetto LinkedList. –