Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Clase Utilitaria Collectors para Stream API | Operaciones Terminales en la Stream API
Stream API

bookClase 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

Main.java

copy
1234567891011121314151617181920
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
123456789101112131415161718
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
12345678910111213141516
package 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?

question mark

¿Qué hace el siguiente código?

Select the correct answer

question mark

¿Qué método de Collectors se debe usar para agrupar productos por su primera letra?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Awesome!

Completion rate improved to 2.33

bookClase 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

Main.java

copy
1234567891011121314151617181920
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
123456789101112131415161718
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
12345678910111213141516
package 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?

question mark

¿Qué hace el siguiente código?

Select the correct answer

question mark

¿Qué método de Collectors se debe usar para agrupar productos por su primera letra?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 3
some-alt