2016-05-14 12 views
6

Ho cercato su Google e ho anche cercato di trovare la documentazione ma non ci sono riuscito.è List.forOne ordinato in Java?

La domanda è semplice. Ho un List diciamo foo. se lo faccio

foo.forEach(this::doSomething) e utilizzare nuovamente la stessa linea per lo stesso foo avrei l'ordine dell'iterazione stesso ogni volta?

Se sì, che dire di foo.stream().forEach()?

+0

Sarebbe piuttosto strano se l'ordine di iterazione di una struttura dati sequenziale non fosse ... sequenziale. –

+3

Regola generale con le librerie: se non è documentata in modo esplicito, non aspettarti che si comporti come pensi o in modo coerente. – sim642

risposta

9

forEach è definito nel Iterable e Javadoc dice:

Salvo diversamente specificato dalla classe che implementa, azioni vengono eseguite nell'ordine di iterazione (se viene specificato un ordine di iterazione ).

Ora List.iterator() dice:

restituisce un iteratore sugli elementi di questo elenco nella sequenza corretta.

Quindi per default si dovrebbe aspettare che forEach enumera gli elementi nella sequenza corretta - a meno che un'implementazione lista ha un'implementazione iteratore diversa.


Secondo Stream.forEach Javadoc ti dice che non si dovrebbe fare affidamento su un ordine:

Il comportamento di questa operazione è esplicitamente non deterministico. Per le condotte a flusso parallelo , questa operazione fa non garantire per rispettare l'ordine di incontro del flusso, poiché così facendo sacrificare il vantaggio del parallelismo.

ma c'è anche Stream.forEachOrdered:

esegue un'azione per ogni elemento di questo flusso, nell'ordine incontro del flusso se il flusso ha un ordine incontro definito.

+0

scusate ma in questo caso 'parallelStream(). ForEach()' ritornerebbe anche in sequenza? –

+1

@SarpKaya no potrebbe non - vedere la mia modifica – wero

Problemi correlati