2014-06-13 14 views
19

Se chiamo collect su un flusso sequenziale (ad es. Da chiamare Collection.stream()), allora userà il parametro combiner I pass per raccogliere? Presumo non ma non vedo nulla nella documentazione. Se ho ragione, mi sembra spiacevole dover fornire qualcosa che so che non sarà usato (se so che è un flusso sequenziale).Un flusso sequenziale in Java 8 utilizza il parametro combiner per chiamare collect?

+1

Cosa succede quando si passa null per il combinatore? Cosa deduci da questo esperimento? –

risposta

18

Ricordarsi di sviluppare le specifiche dell'interfaccia, non contro l'implementazione. L'implementazione potrebbe cambiare con la prossima versione di Java, mentre la specifica dovrebbe rimanere stabile.

La specifica non distingue tra flussi sequenziali e paralleli. Per questo motivo, si dovrebbe presupporre che possa essere utilizzato il combinatore . In realtà, ci sono buoni esempi che mostrano che i combinatori per gli stream sequenziali possono migliorare le prestazioni. Ad esempio, la seguente operazione riduce l'operazione concatena un elenco di stringhe. L'esecuzione del codice senza il combinatore ha una complessità quadratica. Un'esecuzione intelligente con il combinatore può ridurre il tempo di esecuzione in base alle grandezze.

List<String> tokens = ...; 
String result = tokens.stream().reduce("", String::concat, String::concat); 
+4

Sarebbe * molto * intelligente se l'implementazione di 'Stream' riconosce se l'utilizzo del combinatore può migliorare le prestazioni. Tuttavia, il rischio maggiore è che lo sviluppatore stesso cambi un flusso in parallelo in un momento in cui si è dimenticato del combinatore omesso ... – Holger

+3

@Holger A destra, o un altro sviluppatore passa un flusso al tuo codice e quel flusso potrebbe cambiare per essere parallelo in futuro. –

+2

Grazie per la risposta. Ho avuto lo stesso problema, e mentre ho sempre aderito allo sviluppo dell'interfaccia, trovo un peccato che non ci sia una versione "semplice" di un collezionista senza combinatore. Ciò renderebbe MOLTO più facile. Avrebbero potuto creare un 'Collector.Characteristics' per indicare questo, o una versione più semplice dell'interfaccia' Collector' ... – glglgl

Problemi correlati