¿Collection.stream (). Filter (). ForEach () es ineficiente en comparación con un estándar para cada bucle?


15

IntelliJ IDEA me recomendó en este momento reemplazar el siguiente ciclo for-each con una llamada Java 8 "forEach":

    for (Object o : objects) {
        if (o instanceof SomeObject) {
            doSomething();
        }
    }

La llamada recomendada quisiera así:

objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());

A menos que no entienda cómo funciona la funcionalidad subyacente de Stream, me parece que usar stream es una operación O (2n) en lugar de una operación O (n) para el bucle estándar de cada bucle.


8
¿Por qué crees que es O ^ 2? De hecho, los flujos se inventaron específicamente para (a) permitir una sintaxis más agradable y (b) no introducir una sobrecarga adicional. (De hecho, a menudo reducen los gastos generales mediante una evaluación perezosa.)
Kilian Foth

Basándome en la sintaxis, parece que primero está iterando para filtrar y luego iterando sobre los objetos filtrados por segunda vez para ejecutar mi código.
Mirrana

66
Incluso si lo hiciera, seguiría siendo O (2 * N), que es O (N), es decir, lineal y no cuadrático. Pero en realidad las iteraciones se entrelazan entre sí, y ambas pueden terminar antes si el resultado ya se conoce, esa es la belleza de las transmisiones. Definitivamente vale la pena pasar 15 minutos para leer las transmisiones en Java 8; como escribe Venkat Subramaniam, '' Las expresiones lambda son la droga de iniciación a Java 8, pero corrientes son la verdadera adicción. ''
Kilian Foth

1
Además: tu bucle es un antipatrón;)
Thomas Junk

1
@ThomasJunk ¿Puedes explicar cómo es un antipatrón? No estoy familiarizado con este.
Mirrana

Respuestas:


21

Las secuencias Java no iteran a través de su colección una vez para cada declaración, a pesar de lo que implica la sintaxis. Aplica la cadena completa a cada elemento, un elemento a la vez.

En su caso, la transmisión funcionaría exactamente como el bucle. Tome un elemento, compárelo con su predicado y luego aplique su operación, luego pase al siguiente elemento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.