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);
}
});
- ¿Cuáles son los mejores trucos informáticos?
- ¿Cuáles son algunos buenos métodos para tratar con niños ruidosos y llorones de otras personas en vuelos largos?
- ¿Cuáles son algunos consejos para editar tu propia escritura? ¿Cuáles son algunos pasos y reglas comunes que usan los editores profesionales que uno podría aplicar para la autoedición? ¿Cuáles son algunos errores comunes que uno debe tener en cuenta?
- ¿Cómo puedo tener contraseñas seguras y también recordarlas en Internet y en la vida real?
- ¿Cuáles son algunos buenos consejos para escribir la línea de asunto de los correos electrónicos?
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 ():
- Cree la matriz con un tamaño fijo (el tamaño correcto obtenido de Spliterator).
- Escribe todo el rango en esta matriz.
Ahora con un filtro ():
- 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.
- El siguiente paso es crear y escribir en un búfer.
- Cree una matriz con el tamaño obtenido de un búfer.
- 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.