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!
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:
¿Por qué no utilizar un bucle for o manipular colecciones directamente? Bueno, hay tres razones principales:
Echemos un vistazo a los dos tipos principales de operaciones de transmisión: Intermediata y Terminal.
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 Listnumbers = 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 Listwords = 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 Listnumbers = 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 Listnames = 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.
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 Listnames = 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.
No todas las transmisiones se crean a partir de colecciones. Java proporciona otros tipos de flujos para manejar varios tipos de datos:
IntStream, LongStream, DoubleStream
Estas secuencias están especializadas en tratar con tipos primitivos. En lugar de boxear y unboxing valores como Stream
Ejemplo:
java Copy code IntStream intStream = IntStream.of(1, 2, 3, 4); int sum = intStream.sum(); // Output: 10
Secuencia de archivos
Puedes crear transmisiones a partir de archivos usando Files.lines().
java Copy code try (Streamlines = 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.
¡Buena pregunta! Comparemos:
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!
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