instream - metodos de stream java
java 8 parallelStream() con ordenado() (2)
Además, puede leer más sobre el paralelismo y para EachOrdered con un buen ejemplo desde here . En resumen, el uso de forEachOrdered en una secuencia paralela puede resultar en la pérdida de los beneficios del paralelismo.
Aquí el ejemplo del mismo recurso:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers =
new ArrayList<>(Arrays.asList(intArray));
System.out.println("listOfIntegers:");
listOfIntegers
.stream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("listOfIntegers sorted in reverse order:");
Comparator<Integer> normal = Integer::compare;
Comparator<Integer> reversed = normal.reversed();
Collections.sort(listOfIntegers, reversed);
listOfIntegers
.stream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("Parallel stream");
listOfIntegers
.parallelStream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("Another parallel stream:");
listOfIntegers
.parallelStream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("With forEachOrdered:");
listOfIntegers
.parallelStream()
.forEachOrdered(e -> System.out.print(e + " "));
System.out.println("");
Y la salida es
listOfIntegers:
1 2 3 4 5 6 7 8
listOfIntegers sorted in reverse order:
8 7 6 5 4 3 2 1
Parallel stream:
3 4 1 6 2 5 7 8
Another parallel stream:
6 3 1 5 7 8 4 2
With forEachOrdered:
8 7 6 5 4 3 2 1
La quinta canalización utiliza el método forEachOrdered, que procesa los elementos del flujo en el orden especificado por su fuente, independientemente de si ejecutó el flujo en serie o en paralelo. Tenga en cuenta que puede perder los beneficios del paralelismo si usa operaciones como forEachOrdered con flujos paralelos
.
JDK 8 EA ya está disponible, y solo estoy tratando de acostumbrarme a la lambda y al nuevo Stream API. He intentado ordenar una lista con flujo paralelo, pero el resultado siempre es incorrecto:
import java.util.ArrayList;
import java.util.List;
public class Test
{
public static void main(String[] args)
{
List<String> list = new ArrayList<>();
list.add("C");
list.add("H");
list.add("A");
list.add("A");
list.add("B");
list.add("F");
list.add("");
list.parallelStream() // in parallel, not just concurrently!
.filter(s -> !s.isEmpty()) // remove empty strings
.distinct() // remove duplicates
.sorted() // sort them
.forEach(s -> System.out.println(s)); // print each item
}
}
SALIDA:
C
F
B
H
A
Tenga en cuenta que cada vez que la salida es diferente. Mi pregunta es, ¿es un error? ¿O no es posible ordenar una lista en paralelo? si es así, entonces ¿por qué el JavaDoc no dice eso? Última pregunta, ¿hay otra operación cuya salida diferiría dependiendo del tipo de flujo?
forEachOrdered
utilizar forEachOrdered
, no forEach
.
Según el documento forEach
:
Para las tuberías de flujo paralelo, esta operación no garantiza respetar el orden de encuentro del flujo, ya que al hacerlo se sacrificaría el beneficio del paralelismo. Para cualquier elemento dado, la acción se puede realizar en cualquier momento y en cualquier hilo que elija la biblioteca. Si la acción accede al estado compartido, es responsable de proporcionar la sincronización requerida.