¿Cuáles son algunos consejos, trucos y trucos al usar agregados de flujo de Java 8?

En primer lugar, me gustaría señalar que Stream API generalmente se implementa para simplificar un procesamiento paralelo de big data. Además, podemos usarlo con procesamiento secuencial, pero perderá cerca del 15% del rendimiento, por lo que es mejor usar un iterador.

Los principales casos de uso y trucos que puedes encontrar aquí: Parte 1 y Parte 2 .

Déjame mostrarte un ejemplo con un resultado no tan obvio:

List list = new ArrayList (Arrays.asList (“Arne”, “Chuck”, “Slay”));
list.stream (). forEach (s -> {
if (s.equals (“Chuck”)) {
list.remove (s);
}
});

A primera vista en el procesamiento de tiempo de ejecución, tenemos que obtener ConcurrentModificationException, pero en su lugar obtendremos NullPointerException.

Mucho mejor es usar el nuevo método list.removeIf (“Chuck” :: equals);

Además, si le importa el rendimiento, necesita saber cómo cada método cambia su transmisión, tal vez ya se haya ordenado o redimensionado.

Por ejemplo:

IntStream.range (0, 100_000_000)
.toArray ();
IntStream.range (0, 100_000_000)
.filter (x-> verdadero)
.toArray ();

Estas dos secuencias están haciendo lo mismo, pero en la segunda secuencia, agregamos un filtro inútil (x-> verdadero). Además, este método elimina la característica del tamaño.

Veamos cómo funcionará sin un método filter ():

  1. Cree la matriz con un tamaño fijo (el tamaño correcto obtenido de Spliterator).
  2. Escribe todo el rango en esta matriz.

Ahora con un filtro ():

  1. Si lee documentos sobre Stream, debe saber que los streams usaron Spliterator como la fuente de datos y Spliterator tiene un valor SIZED, este valor es efectivo para la operación de clasificación o en nuestro caso para el uso de Array (). Sin embargo, cuando usamos un método filter (), stream restablece estas características y pasamos al siguiente paso.
  2. El siguiente paso es crear y escribir en un búfer.
  3. Cree una matriz con el tamaño obtenido de un búfer.
  4. Escriba todos los datos de un búfer en nuestra matriz.

Ahora puede ver que la principal desventaja del caso con un filtro () es que usamos memoria adicional para crear un búfer. Para obtener más detalles, puede buscar cómo se conectan Spliterator y Streams.

Y un ejemplo más:

List list = new ArrayList (Arrays.asList (“Arne”, null, “Slay”));
Comparador comparador = Comparator.nullsLast (Comparator.naturalOrder ());

y

System.out.println (Collections.max (lista, comparador));
System.out.println (list.stream (). Collect (Collectors.maxBy (comparator)). Get ());
System.out.println (list.stream (). Max (comparador) .get ());

En el primer paso seremos nulos. Segundo: arroja NoSuchElementException y el último caso arrojará NullPointerException.

Si quieres continuar: Weird Stream API

¡Buena suerte! Avísame si respondí tu pregunta.