setborder - titledborder java
¿Cómo asegurar el orden de procesamiento en las secuencias java8? (1)
Estás haciendo la pregunta equivocada.
Está preguntando sobre
sequential
frente a
parallel
mientras que desea procesar los artículos
en orden
, por lo que debe preguntar sobre el
pedido
.
Si tiene una secuencia
ordenada
y realiza operaciones que garantizan mantener la orden, no importa si la secuencia se procesa en paralelo o secuencial;
La implementación mantendrá el orden.
La propiedad ordenada es distinta de paralela versus secuencial.
Por ejemplo, si llama a
stream()
en un
HashSet
el flujo se desordenará al llamar a
stream()
en una
List
devuelve un flujo ordenado.
Tenga en cuenta que puede llamar a
unordered()
para liberar el contrato de pedido y potencialmente aumentar el rendimiento.
Una vez que la secuencia no tiene orden, no hay forma de restablecer el orden.
(La única forma de convertir una secuencia desordenada en ordenada es llamar
sorted
, sin embargo, el orden resultante no es necesariamente el orden original).
Consulte también la
sección "Pedidos"
de la
documentación del paquete
java.util.stream
.
Para garantizar el mantenimiento del pedido a lo largo de una operación de flujo completo, debe estudiar la documentación de la fuente del flujo, todas las operaciones intermedias y la operación del terminal para saber si mantienen el pedido o no (o si la fuente tiene un pedido en el primer sitio).
Esto puede ser muy sutil, por ejemplo,
Stream.iterate(T,UnaryOperator)
crea una secuencia ordenada mientras
Stream.generate(Supplier)
crea una secuencia
no ordenada
.
Tenga en cuenta que también cometió un error común en su pregunta, ya que
forEach
no
mantiene el orden.
forEachOrdered
usar
forEachOrdered
si desea procesar los elementos de la secuencia en un orden garantizado.
Entonces, si su
list
en su pregunta es de hecho una
java.util.List
, su método
stream()
devolverá una secuencia
ordenada
y el
filter
no cambiará el orden.
Entonces, si llama a
list.stream().filter() .forEachOrdered()
, todos los elementos se procesarán secuencialmente en orden, mientras que para
list.parallelStream().filter().forEachOrdered()
los elementos podrían procesarse en paralelo ( por ejemplo, por el filtro), pero la acción de la terminal todavía se llamará en orden (lo que obviamente reducirá el beneficio de la ejecución paralela).
Si, por ejemplo, usa una operación como
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
toda la operación podría beneficiarse de la ejecución paralela, pero la lista resultante siempre estará en el orden correcto, independientemente de si usa una secuencia paralela o secuencial.
Quiero procesar listas dentro de un objeto java
XML
.
Tengo que asegurarme de procesar todos los elementos para poder recibirlos.
¿Por lo tanto, debo llamar
sequential
en cada
stream
que uso?
list.stream().sequential().filter().forEach()
¿O es suficiente usar la secuencia siempre que no use el paralelismo?
list.stream().filter().forEach()