"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Java Streams: la guía definitiva para principiantes

Java Streams: la guía definitiva para principiantes

Publicado el 2024-11-04
Navegar:350

Entonces, estás aquí para aprender sobre Arroyos en Java, pero no el tipo de arroyos donde la gente va a pescar o fluye el agua. Estamos hablando de flujos de datos, una poderosa característica introducida en Java 8 que hace que trabajar con datos sea mucho más fácil. Si eres nuevo en esto o lo has probado pero no pudiste descifrarlo, no te preocupes. Lo guiaré a lo largo de todo el viaje en un lenguaje sencillo y fácil de entender.

¿Listo? ¡Vamos a sumergirnos en Java Streams!


Java Streams: The Ultimate Guide for Complete Beginners


¿Qué es una secuencia en Java?

Un Stream es una forma de procesar datos en una secuencia. Imagine que tiene una lista de elementos y desea hacer algo con esos elementos (filtrar, ordenar, asignar, etc.). Un Stream te permite hacer todo eso de una manera limpia y eficiente. Es como una línea de montaje donde los datos fluyen a través de diferentes pasos hasta que se procesan.

Cosas clave que debes recordar sobre las transmisiones:

  1. Las transmisiones no modifican los datos originales. Piensa en ellos como una vista o un canal sobre tus datos.
  2. Los flujos procesan los datos de forma perezosa, lo que significa que no realizan ningún trabajo real hasta que usted les indica que produzcan un resultado final. Esto evita cálculos innecesarios.
  3. Las transmisiones son de un solo uso. Una vez que se ha consumido una transmisión, desaparece. Tendrás que crear uno nuevo si quieres reutilizarlo.

¿Por qué utilizar transmisiones?

¿Por qué no utilizar un bucle for o manipular colecciones directamente? Bueno, hay tres razones principales:

  • Código más limpio: No es necesario escribir bucles voluminosos y repetitivos. Streams te ofrece una forma limpia y legible de procesar datos.
  • Mejor rendimiento: con una evaluación diferida, las transmisiones procesan datos de manera más eficiente. Solo trabajan con datos cuando es necesario, lo que puede ahorrar tiempo de procesamiento.
  • Estilo funcional: Streams aporta un estilo de programación más declarativo y funcional a Java, lo que significa que te concentras en qué quieres hacer, no en cómo.

¿Cómo funcionan las transmisiones? Los conceptos básicos

Echemos un vistazo a los dos tipos principales de operaciones de transmisión: Intermediata y Terminal.

1. Operaciones Intermedias

Estas son las operaciones que preparan los datos pero no producen un resultado final de inmediato. Piense en estos como los pasos del “taller”.

  • filtrar()

    Esto es como un colador. Selecciona elementos según una condición. Por ejemplo, si desea solo los números pares de una lista de números enteros, usaría filter().

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 3, 4, 5);
    List evenNumbers = numbers.stream()
                                       .filter(n -> n % 2 == 0)
                                       .collect(Collectors.toList());
    // Output: [2, 4]
    
    

    ¿Por qué filtrar? Sin filter(), necesitaría recorrer manualmente la lista y agregar solo los elementos coincidentes a una nueva lista. filter() te permite hacer esto en un solo paso.

  • mapa()

    Este es un transformador. Toma un elemento y devuelve algo diferente. Por ejemplo, si tiene una lista de cadenas y desea las longitudes de cada cadena:

    java
    Copy code
    List words = Arrays.asList("apple", "banana", "cherry");
    List lengths = words.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
    // Output: [5, 6, 6]
    
    

    ¿Por qué map? map() se usa cuando necesitas transformar cada elemento en otra cosa, como convertir una lista de cadenas en una lista de sus longitudes.

  • distinto()

    Es como un filtro duplicado. Esto elimina elementos duplicados de una secuencia.

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
    List distinctNumbers = numbers.stream()
                                           .distinct()
                                           .collect(Collectors.toList());
    // Output: [1, 2, 3, 4, 5]
    
    

    ¿Por qué distinto? En una lista normal, necesitaría verificar manualmente si hay duplicados. distintivo() hace esto por usted en una línea.

  • ordenado()

    Esto clasifica tus datos en orden natural (o personalizado, si lo deseas).

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List sortedNames = names.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
    // Output: ["Alice", "Bob", "Charlie"]
    
    

    ¿Por qué sorted? En lugar de escribir la lógica de clasificación usted mismo, sorted() la maneja por usted.

2. Operaciones terminales

Estos son los que producen el resultado final y desencadenan el procesamiento de todo el flujo. Piense en estos como el "punto de salida".

  • recolectar()

    Esta es la operación de terminal más común. Reúne los resultados de la transmisión y los coloca en una Lista, Conjunto u otra colección.

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List upperNames = names.stream()
                                   .map(String::toUpperCase)
                                   .collect(Collectors.toList());
    // Output: ["CHARLIE", "ALICE", "BOB"]
    
    

    ¿Por qué recopilar? Casi siempre usarás recopilar() para recopilar los resultados de tu transmisión en una colección. Es tu última parada.

  • para cada()

    Si no necesitas un resultado y solo quieres realizar una acción en cada elemento (como imprimirlos), forEach() es tu amigo.

    java
    Copy code
    numbers.stream()
           .forEach(System.out::println);
    
    

    ¿Por qué forEach? Esto es perfecto para efectos secundarios, como imprimir datos en la consola o escribir en un archivo.

  • reducir()

    reduce() toma una gran cantidad de datos y los reduce a un solo resultado. Por ejemplo, sumar una lista de números:

    java
    Copy code
    int sum = numbers.stream()
                     .reduce(0, Integer::sum);
    // Output: 15
    
    

    ¿Por qué reducir? Cuando necesites combinar o acumular valores en un solo resultado, reduce() es tu opción.


Otros tipos de corrientes

No todas las transmisiones se crean a partir de colecciones. Java proporciona otros tipos de flujos para manejar varios tipos de datos:


Java Streams: The Ultimate Guide for Complete Beginners


  1. IntStream, LongStream, DoubleStream

    Estas secuencias están especializadas en tratar con tipos primitivos. En lugar de boxear y unboxing valores como Stream, puedes usarlos para evitar penalizaciones de rendimiento.

    Ejemplo:

    java
    Copy code
    IntStream intStream = IntStream.of(1, 2, 3, 4);
    int sum = intStream.sum();  // Output: 10
    
    
  2. Secuencia de archivos

    Puedes crear transmisiones a partir de archivos usando Files.lines().

    java
    Copy code
    try (Stream lines = Files.lines(Paths.get("data.txt"))) {
        lines.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    

    ¿Por qué utilizar secuencias de archivos? Cuando se trata de archivos grandes, cargar todos los datos en la memoria puede no ser eficiente. El uso de una secuencia le permite procesarla línea por línea.


¿Cuándo utilizar transmisiones?

  • Transformación de datos: Cuando necesitas modificar cada elemento de una colección.
  • Filtrado: Cuando desea seleccionar solo los datos que coinciden con ciertas condiciones.
  • Agregación de datos: cuando necesita reducir una colección a un solo resultado (por ejemplo, suma, promedio).
  • Procesamiento paralelo: Las transmisiones también admiten el paralelismo. Con .parallelStream(), puedes dividir tus tareas en varios subprocesos para un procesamiento más rápido.

Transmisión versus bucles: ¿por qué no utilizar simplemente bucles?

¡Buena pregunta! Comparemos:

  1. Legibilidad: Con Streams, te concentras en qué quieres hacer, no en cómo. Los bucles tienden a obligarte a escribir mucho código repetitivo adicional (como contadores y condicionales).
  2. Rendimiento: Las transmisiones están optimizadas para manejar grandes cantidades de datos de manera eficiente, especialmente con evaluación diferida y paralelismo. Los bucles no ofrecen optimizaciones tan listas para usar.
  3. Flexibilidad: Las transmisiones le permiten encadenar operaciones (como filtrado, mapeo y reducción) en un estilo limpio y funcional. Los bucles requerirían que anidaras más lógica dentro de ellos.

Concluyendo

Las transmisiones en Java tienen como objetivo simplificar la forma en que procesa los datos. Hacen que su código sea más legible, más fácil de mantener y más eficiente cuando trabaja con colecciones. Ya sea que esté filtrando, transformando o reduciendo datos, Streams lo cubre con métodos claros y directos que eliminan la necesidad de bucles voluminosos y trabajo manual.

Ahora que estás bien equipado con los conceptos básicos de Streams, ¿por qué detenerte aquí? Sígueme en Twitter, LinkedIn o visita mi blog para obtener más consejos de Java que te convertirán en un profesional en poco tiempo. Y si esta guía te resultó útil, compártela con tus compañeros desarrolladores, ¡porque compartir es cuidar!


¿Listo para probarlo? ¡Hagamos que esa corriente fluya en tu próximo proyecto!

Declaración de liberación Este artículo se reproduce en: https://dev.to/wittedtech-by-harshit/java-streams-the-ultimate-guide-for-complete-beginners-40e2?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3