Clase Utilitaria Collectors para Stream API
El método collect() en la Stream API ya nos resulta familiar como una herramienta poderosa para reunir elementos de un stream en estructuras de datos convenientes. Sin embargo, collect() en sí mismo requiere una implementación de Collector, lo que puede hacer el proceso más complejo.
Aquí es donde la clase Collectors resulta útil, ya que proporciona un conjunto de implementaciones predefinidas para las operaciones más comunes. Facilita tareas como recopilar datos en colecciones, agrupar y contar, haciendo que estas operaciones sean mucho más sencillas.
Métodos clave de la clase Collectors
La clase Collectors ofrece numerosas soluciones listas para usar, eliminando la necesidad de implementar manualmente un Collector. A continuación se presentan algunos de los métodos principales:
La Stream API también ofrece el método incorporado toList(), que ya has utilizado antes. Este método tiene una sintaxis concisa, lo que lo convierte en nuestra opción preferida. Sin embargo, puedes utilizar cualquier implementación que se adapte mejor a tus necesidades.
Conversión de una lista a un mapa
Suponga que dispone de una lista de productos con sus precios, almacenados como cadenas en el formato Name=Price. El objetivo es crear un Map donde la clave sea el nombre del producto y el valor sea su precio.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
En este caso, se utiliza toMap() para dividir cada cadena (split("=")) y crear un Map<String, Integer>, donde la clave es el nombre del producto y el valor es su precio como entero. Por ejemplo, la cadena Laptop=1500 se transforma en la entrada Laptop -> 1500.
Agrupación de productos por la primera letra
Agrupación de productos por su primera letra para identificar los artículos que comienzan con la misma letra.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
El programa crea una List de nombres de productos y los agrupa por su primera letra utilizando groupingBy(). El resultado se almacena en un Map, donde la clave es charAt(0) y el valor es una lista de productos coincidentes. Finalmente, se imprimen los productos agrupados.
División de precios
Collectors.partitioningBy es un collector especial en la Stream API que divide los elementos en dos grupos según un predicado dado.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Devuelve un Map<Boolean, List<T>>, donde true representa los elementos que cumplen la condición, y false representa aquellos que no la cumplen.
Esto es útil para separar datos, como filtrar números pares e impares o productos de precio alto y bajo.
Ejemplo
Dividamos los precios de los productos en dos categorías: caros (mayores a $1000) y baratos ($1000 o menos).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
El método partitioningBy() divide la lista de precios en dos grupos. Si un precio es mayor que 1000, se coloca bajo la clave true; de lo contrario, se ubica bajo false.
Conteo de productos
Contar cuántos productos comienzan con la misma letra.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
El programa procesa la List de productos utilizando stream(), luego aplica groupingBy() con charAt(0) para agrupar las palabras por su primera letra. El colector counting() cuenta cuántos productos hay en cada grupo, y el Map final almacena la letra como clave y la cantidad como valor.
Unir nombres de productos
Concatenación de nombres de productos en una sola cadena, separándolos con comas.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
El método Collectors.joining(", ") concatena todos los nombres de productos en una sola cadena, separándolos con comas. Finalmente, la cadena resultante se imprime para mostrar la lista de productos en un formato legible.
1. ¿Qué hace el siguiente código?
2. ¿Qué método de Collectors se debe usar para agrupar productos por su primera letra?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 2.33
Clase Utilitaria Collectors para Stream API
Desliza para mostrar el menú
El método collect() en la Stream API ya nos resulta familiar como una herramienta poderosa para reunir elementos de un stream en estructuras de datos convenientes. Sin embargo, collect() en sí mismo requiere una implementación de Collector, lo que puede hacer el proceso más complejo.
Aquí es donde la clase Collectors resulta útil, ya que proporciona un conjunto de implementaciones predefinidas para las operaciones más comunes. Facilita tareas como recopilar datos en colecciones, agrupar y contar, haciendo que estas operaciones sean mucho más sencillas.
Métodos clave de la clase Collectors
La clase Collectors ofrece numerosas soluciones listas para usar, eliminando la necesidad de implementar manualmente un Collector. A continuación se presentan algunos de los métodos principales:
La Stream API también ofrece el método incorporado toList(), que ya has utilizado antes. Este método tiene una sintaxis concisa, lo que lo convierte en nuestra opción preferida. Sin embargo, puedes utilizar cualquier implementación que se adapte mejor a tus necesidades.
Conversión de una lista a un mapa
Suponga que dispone de una lista de productos con sus precios, almacenados como cadenas en el formato Name=Price. El objetivo es crear un Map donde la clave sea el nombre del producto y el valor sea su precio.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
En este caso, se utiliza toMap() para dividir cada cadena (split("=")) y crear un Map<String, Integer>, donde la clave es el nombre del producto y el valor es su precio como entero. Por ejemplo, la cadena Laptop=1500 se transforma en la entrada Laptop -> 1500.
Agrupación de productos por la primera letra
Agrupación de productos por su primera letra para identificar los artículos que comienzan con la misma letra.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
El programa crea una List de nombres de productos y los agrupa por su primera letra utilizando groupingBy(). El resultado se almacena en un Map, donde la clave es charAt(0) y el valor es una lista de productos coincidentes. Finalmente, se imprimen los productos agrupados.
División de precios
Collectors.partitioningBy es un collector especial en la Stream API que divide los elementos en dos grupos según un predicado dado.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Devuelve un Map<Boolean, List<T>>, donde true representa los elementos que cumplen la condición, y false representa aquellos que no la cumplen.
Esto es útil para separar datos, como filtrar números pares e impares o productos de precio alto y bajo.
Ejemplo
Dividamos los precios de los productos en dos categorías: caros (mayores a $1000) y baratos ($1000 o menos).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
El método partitioningBy() divide la lista de precios en dos grupos. Si un precio es mayor que 1000, se coloca bajo la clave true; de lo contrario, se ubica bajo false.
Conteo de productos
Contar cuántos productos comienzan con la misma letra.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
El programa procesa la List de productos utilizando stream(), luego aplica groupingBy() con charAt(0) para agrupar las palabras por su primera letra. El colector counting() cuenta cuántos productos hay en cada grupo, y el Map final almacena la letra como clave y la cantidad como valor.
Unir nombres de productos
Concatenación de nombres de productos en una sola cadena, separándolos con comas.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
El método Collectors.joining(", ") concatena todos los nombres de productos en una sola cadena, separándolos con comas. Finalmente, la cadena resultante se imprime para mostrar la lista de productos en un formato legible.
1. ¿Qué hace el siguiente código?
2. ¿Qué método de Collectors se debe usar para agrupar productos por su primera letra?
¡Gracias por tus comentarios!