Ho cercato di capire e mostrare come i flussi Java implementano un tipo di fusione loop sotto il cofano, in modo che più operazioni possano essere fuse in un singolo passaggio.Operazione di streaming Java e operazioni intermedie stateful
Questo primo esempio qui:
Stream.of("The", "cat", "sat", "on", "the", "mat")
.filter(w -> {
System.out.println("Filtering: " + w);
return w.length() == 3;
})
.map(w -> {
System.out.println("Mapping: " + w);
return w.toUpperCase();
})
.forEach(w -> System.out.println("Printing: " + w));
ha il seguente output (con la fusione di un singolo passaggio per ogni elemento chiaro):
Filtering: The
Mapping: The
Printing: THE
Filtering: cat
Mapping: cat
Printing: CAT
Filtering: sat
Mapping: sat
Printing: SAT
Filtering: on
Filtering: the
Mapping: the
Printing: THE
Filtering: mat
Mapping: mat
Printing: MAT
Il secondo esempio è lo stesso ma utilizzare l'operazione Sort() tra il filtro e la mappa:
Stream.of("The", "cat", "sat", "on", "the", "mat")
.filter(w -> {
System.out.println("Filtering: " + w);
return w.length() == 3;
})
.sorted()
.map(w -> {
System.out.println("Mapping: " + w);
return w.toUpperCase();
})
.forEach(w -> System.out.println("Printing: " + w));
Questo ha il seguente output:
Filtering: The
Filtering: cat
Filtering: sat
Filtering: on
Filtering: the
Filtering: mat
Mapping: The
Printing: THE
Mapping: cat
Printing: CAT
Mapping: mat
Printing: MAT
Mapping: sat
Printing: SAT
Mapping: the
Printing: THE
Quindi la mia domanda è qui, con la chiamata a distinti, sono io ragione nel pensare che, poiché si tratta di un'operazione intermedia "stateful", che non consente singoli elementi da elaborare singolarmente nel corso di un singolo passaggio (di tutte le operazioni). Inoltre, poiché l'operazione stateful sort() deve elaborare l'intero flusso di input per produrre un risultato, la tecnica di fusione non può essere distribuita qui, quindi è per questo che tutto il filtraggio si verifica prima e quindi unisce le operazioni di mappatura e stampa , dopo il tipo? Per favore correggimi se qualcuno dei miei presupposti non è corretto e sentiti libero di approfondire ciò che ho già detto.
Inoltre, come può decidere in base a quale limite fondere insieme gli elementi in un singolo passaggio o meno, ad esempio, quando esiste l'operazione distinct(), c'è semplicemente una bandiera che si spegne per fermarlo da succede come quando distinto() non c'è?
Una query finale è, mentre il vantaggio di operazioni di fusione in un singolo passaggio è talvolta evidente, ad esempio, quando combinato con cortocircuito. Quali sono i principali vantaggi di unire insieme operazioni come filter-map-forEach o persino una filter-map-sum?
potresti semplicemente rispondere alle tue domande eseguendo il debug del tuo esempio – wero
Immagino che ogni volta che hai scritto "distinto" intendessi "ordinato" ... – Holger