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?
risposta
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);
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
@Holger A destra, o un altro sviluppatore passa un flusso al tuo codice e quel flusso potrebbe cambiare per essere parallelo in futuro. –
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
- 1. Java 8 collect vs reduce
- 2. In Java 8, un flusso sequenziale e ordinato garantisce l'esecuzione delle operazioni nell'ordine di incontro?
- 3. builder con un Java 8 flusso
- 4. Esiste un modo per riutilizzare un flusso in java 8?
- 5. Java 8, flusso di intero, raggruppamento degli indici di un flusso per i numeri interi?
- 6. Java 8 flusso di file
- 7. Java 8 mappatura del flusso lista
- 8. Java 8 Lambdas: Mappare un flusso per digitare Integer e quindi chiamare sum() non verrà compilato
- 9. lista Raccogliere di Long dal doppio flusso in Java 8
- 10. Il modo migliore per raccogliere il flusso Java-8 su Guava ImmutableList
- 11. Aggiungere condizionatamente un'operazione a un flusso Java 8
- 12. Combina flusso di raccolte in una raccolta - Java 8
- 13. Guida sequenziale in Java
- 14. Java 8 utilizza automaticamente il multicore?
- 15. Come creare un flusso Java 8 da un iteratore?
- 16. Qual è il modo migliore per aggregare gli stream in un DISTINCT con Java 8
- 17. Java 8 flusso - somma di oggetti
- 18. È possibile eseguire un gruppo pigro, restituendo un flusso, in java 8?
- 19. Mapreduce Combiner
- 20. Classe “Combiner" in un lavoro MapReduce
- 21. Ottenere l'elemento successivo da un flusso Java 8
- 22. Java 8 lambda per Kotlin lambda
- 23. Il server COM deve chiamare SysFreeString() per un parametro [out]?
- 24. Java 8 loop nidificati per lo streaming
- 25. .collect con un indice
- 26. Differenza tra flusso() map() e stream.map ({}) in Java 8
- 27. Perché è necessario un combinatore per ridurre il metodo che converte il tipo in java 8
- 28. parallelo flusso dà elementi nulli, come fare in Java 8
- 29. setup intellij per chiedere il parametro type quando si utilizza generics in java
- 30. foreach% dopar% utilizza l'installazione sequenziale dell'operatore con il cluster PSock?
Cosa succede quando si passa null per il combinatore? Cosa deduci da questo esperimento? –