C'è alcuna garanzia che le operazioni su un sequenziale e ordinato flusso sono elaborati al fine incontro?In Java 8, un flusso sequenziale e ordinato garantisce l'esecuzione delle operazioni nell'ordine di incontro?
Voglio dire, se ho il codice come questo:
IntStream.range(0, 5)
.map(i -> {
myFunction(i);
return i * 2;
})
.boxed()
.collect(toList());
C'è una garanzia, che esso deve svolgere myFunction() chiama in ordine all'incontro del campo generato?
ho trovato draft JavaDocs for the Stream classe in cui si afferma esplicitamente questo:
Per oleodotti flusso sequenziale, tutte le operazioni sono eseguite nell'ordine incontro della fonte gasdotto, se la fonte gasdotto ha un ordine incontro definito.
ma nella riga official JavaDocs questa riga è stata rimossa. Ora discute l'ordine dell'incontro solo per i metodi selezionati. Il Package java.util.stream doc nei effetti collaterali comma precisa:
Anche quando un oleodotto è costretto a produrre un risultato coerente con l'ordine incontro della sorgente flusso (ad esempio,
IntStream.range(0,5).parallel().map(x -> x*2).toArray()
deve produrre[0, 2, 4, 6, 8]
), senza le garanzie sono fatte sull'ordine in cui la funzione mapper è applicata ai singoli elementi, o in quale thread qualsiasi parametro comportamentale viene eseguito per un determinato elemento.
ma non dice nulla sui flussi sequenziali e l'esempio è per un flusso parallelo (La mia comprensione è che è vero per entrambi i flussi sequenziali e paralleli, ma questa è la parte che non sono sicuro).
D'altra parte, essa afferma anche nella sezione Ordering:
Se un flusso è ordinato, la maggior parte delle operazioni sono costretti ad operare sugli elementi nel loro ordine incontro; se la fonte di uno stream è un
List
contenente[1, 2, 3]
, il risultato dell'esecuzione dimap(x -> x*2)
deve essere[2, 4, 6]
. Tuttavia, se la fonte non ha un ordine di incontro definito, qualsiasi permutazione dei valori[2, 4, 6]
sarebbe un risultato valido.
ma questa volta è iniziare con "operando sugli elementi", ma l'esempio è di circa il risultante flusso, quindi non sono sicuro che stanno prendendo gli effetti collaterali in considerazione e gli effetti collaterali è davvero ciò che questo domanda riguarda
Questo risponde alla tua domanda? http://stackoverflow.com/questions/36102961/what-is-the-order-in-which-stream-operations-are-applied-to-list-elements – Tunaki
Ho ampliato la domanda per includere la sezione degli ordini, a me sembra che sia in contraddizione con la sezione degli effetti collaterali. – piotrek
Forse questo http://stackoverflow.com/questions/29216588/how-to-ensure-order-of-processing-in-java8-streams –