[Aprende JAVA desde cero | Artículo 29] Corriente

Tabla de contenido

Prefacio:

Corriente de Stram:

Objetivos de diseño:

Pasos para el uso:

1. Primero obtenga un Stream y coloque los datos en él.

2. Use varias API en Stream para operar.

Notas sobre el uso de Stream:

Resumir:


Prefacio:

        En este artículo, aprenderemos Stream, que es como una línea de montaje. Puede procesar los objetos que queremos procesar paso a paso y finalmente lograr el efecto que queremos. Es una gran ayuda en JAVA, y vale la pena entenderlo y dominarlo.

Corriente de Stram:

        La idea central de Stream es la programación funcional , que aboga por tratar el procesamiento de datos como una serie de operaciones de conversión. Esta idea es diferente del método de programación imperativa tradicional, que enfatiza la operación directa de los datos, mientras que la programación funcional presta más atención al proceso de conversión y operación de los datos.

Cuando usamos Stream, podemos considerar la fuente de datos (como una colección o una matriz) como un flujo de un conjunto de elementos, a través de una serie de operaciones intermedias (como filtrar, mapear, clasificar, etc.) y finalmente llegar a la operación de terminación (como emparejar, reducir, recopilar, etc.) para procesar los datos.

Objetivos de diseño:

        El objetivo de diseño de Stream es proporcionar un método de procesamiento de datos conciso y eficiente, haciendo que el código sea más legible, fácil de entender y mantener. Su idea es descomponer el proceso de procesamiento de datos en varios pasos, y cada paso es una operación de conversión, que puede filtrar, mapear, ordenar y otras operaciones en los datos, y finalmente obtener los resultados requeridos.

        Al usar Stream, podemos evitar los bucles tradicionales y los juicios condicionales, y transformar la lógica de procesamiento de datos complejos en llamadas de cadena de métodos claras y concisas, lo que hace que el código sea más conciso y legible.

        Además, Stream también es compatible con el procesamiento en paralelo, que puede dividir un gran conjunto de datos en varios subconjuntos para realizar operaciones en paralelo y mejorar la eficiencia del procesamiento. Este método de procesamiento paralelo puede aprovechar las ventajas de los procesadores multinúcleo, lo que hace que el procesamiento de datos sea más eficiente.

        Con todo, la idea de Stream es ver el proceso de procesamiento de datos como una serie de operaciones de conversión a través de la programación funcional para lograr un procesamiento de datos conciso, eficiente y fácil de entender. Su objetivo de diseño es proporcionar un método de procesamiento de datos elegante y potente, para que los desarrolladores puedan centrarse más en la lógica de la conversión de datos sin preocuparse por la iteración subyacente y el juicio condicional. En general, los flujos Stream se usan junto con expresiones Lambda para simplificar las operaciones en colecciones y matrices .

Pasos para el uso:

Ejemplo:

Por ejemplo, queremos encontrar los datos cuyo primer carácter es "Zhang" en un grupo de datos almacenados en la lista. De acuerdo con el método de escritura tradicional, necesitamos recorrer manualmente cada dato y luego usar la API en la lista para juzgar la primera letra. Sin embargo, la aparición de Stream facilita enormemente nuestra operación.

import java.util.ArrayList;

public class test01 {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张无忌");
        list1.add("赵敏");
        list1.add("张强");
        list1.add("刘三丰");

        //传统方法
        for (String s : list1) {
            if(s.startsWith("张"))
            {
                System.out.println(s);
            }
        }
        //直接调用stream流
        list1.stream().filter(name->name.startsWith("张")).forEach(name->System.out.println(name));

    }
}

A partir de este ejemplo, podemos resumir los dos pasos para llamar al stream stream:

1. Primero obtenga un Stream y coloque los datos en él.

2. Use varias API en Stream para operar.

1. filter(Predicate<T> predicate): Filtra los elementos en la secuencia según las condiciones especificadas y devuelve una nueva secuencia.

2. map(Function<T, R> mapper): realiza una operación de mapeo en cada elemento del flujo y devuelve un nuevo flujo, y los elementos en el nuevo flujo son los resultados mapeados.

3. sorted(): ordena los elementos en la secuencia de forma predeterminada.

4. sorted(Comparator<T> comparador): ordena los elementos en la secuencia de acuerdo con las reglas especificadas.

5. distinto(): Elimina los elementos duplicados en la transmisión y devuelve una nueva transmisión.

6. limit(long maxSize): trunca la secuencia y obtiene los primeros elementos.

7. skip(long n): omite el número especificado de elementos y devuelve una nueva secuencia.

8. forEach(Consumer<T> action): realiza la operación especificada en cada elemento de la transmisión.

9. collect(Collector<T, A, R> colector): recopila los elementos de la secuencia en un conjunto de resultados.

10. anyMatch(Predicate<T> predicate): determina si hay elementos en la secuencia que cumplen las condiciones especificadas.

11. allMatch(Predicate<T> predicate): determine si todos los elementos de la secuencia cumplen las condiciones especificadas.

12. noneMatch(Predicate<T> predicate): determine si no hay elementos en la secuencia que cumplan las condiciones especificadas.

13. findFirst(): Devuelve el primer elemento de la secuencia.

14. findAny(): devuelve cualquier elemento del flujo.

15. reduce(BinaryOperator<T> acumulador): reduce los elementos en la secuencia de acuerdo con la operación de reducción especificada.

16. parallelStream(): Devuelve un flujo paralelo que puede procesar elementos en el flujo en paralelo.

Notas sobre el uso de Stream:

1. El flujo de Stream es de un solo uso: una vez que finaliza el flujo de Stream (como forEach, recopilar, etc.), no se pueden realizar otras operaciones en el mismo flujo de Stream. Si necesita realizar varios pasos de procesamiento en el mismo conjunto de datos, debe crear una nueva secuencia.

2. Preste atención al orden de la secuencia: El orden de las operaciones intermedias de la secuencia Stream es muy importante y se aplicarán a los datos en orden. Por lo tanto, cuando opere en flujos, asegúrese de que el orden de las operaciones intermedias sea correcto para evitar resultados erróneos.

3. Terminar el flujo antes de tiempo: el flujo Stream proporciona muchas operaciones de terminación, como forEach, recopilar, reducir, etc. Cuando utilice estas operaciones de finalización, trate de evitar bucles infinitos o cálculos pesados , y finalice la secuencia antes de tiempo para evitar problemas de rendimiento.

4. Preste atención a la evaluación diferida de la secuencia: la secuencia Stream adopta el método de evaluación diferida, es decir, la operación intermedia no se ejecutará inmediatamente antes de que finalice la operación. Este mecanismo puede mejorar el rendimiento, pero también debe prestar atención al uso de operaciones de activación oportunas, como contar, buscar primero, etc., cuando se requiere una ejecución oportuna.

5. Evite las excepciones de puntero nulo: cuando opere en flujos, debe prestar atención a la situación de valores nulos (null).Al usar operaciones de filtrado, debe considerar el manejo de elementos nulos para evitar excepciones de puntero nulo.

6. Los flujos paralelos deben usarse con precaución: los flujos de flujo admiten el procesamiento paralelo y los flujos paralelos se pueden obtener a través del método de flujo paralelo. Sin embargo, al usar secuencias paralelas, debe prestar atención a los problemas de rendimiento y seguridad de subprocesos para asegurarse de que no habrá condiciones de carrera o degradación del rendimiento cuando el código se ejecuta en paralelo.

7. Uso moderado de operaciones de flujo: los flujos de flujo proporcionan una gran cantidad de métodos de operación, pero eso no significa que las operaciones de flujo deban usarse en todos los casos. En escenarios de procesamiento de datos simples, puede ser más intuitivo y eficiente usar bucles tradicionales.

Resumir:

        El flujo de flujo a menudo se combina con expresiones lambda y la idea de la programación en cadena, lo que reduce en gran medida la complejidad del código. Es una buena opción, pero su desventaja es que reduce la legibilidad del código. Por lo tanto, debemos usar el flujo de flujo de manera razonable para garantizar un equilibrio entre la eficiencia y la legibilidad.

Si mi contenido es útil para ti, dale me gusta, comenta y marca . ¡La creación no es fácil, el apoyo de todos es mi motivación para perseverar!

 

Supongo que te gusta

Origin blog.csdn.net/fckbb/article/details/131773918
Recomendado
Clasificación