Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Trabajar con Estructuras Anidadas con el Método flatMap() | Operaciones Intermedias en Stream API
Stream API

bookTrabajar con Estructuras Anidadas con el Método flatMap()

Al trabajar con colecciones de datos en Java, a menudo se presentan situaciones donde nuestras estructuras están anidadas. Por ejemplo, puedes tener una lista de objetos, cada uno de los cuales contiene otra lista de objetos.

En estos casos, las operaciones estándar como map() no son adecuadas para extraer todos los datos anidados en un solo stream. Aquí es donde entra en juego el método flatMap() de la Stream API.

El método flatMap() recibe una función que transforma cada elemento del stream en un nuevo stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — el tipo de elementos en el stream resultante;
  • Function<? super T, ? extends Stream<? extends R>> mapper — una función que toma un elemento del stream original (T) y devuelve un stream (Stream<R>) de elementos resultantes.

Es importante comprender que flatMap() no devuelve simplemente un nuevo elemento, sino un stream (u otra colección) para cada elemento. Estos streams individuales luego se combinan en uno solo.

Aplicación práctica

Imagina que tienes varias fábricas, cada una produciendo diferentes tipos de productos. Nuestro objetivo es crear una lista unificada de todos los productos de estas fábricas y convertir sus nombres a mayúsculas.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }

La lista factories contiene múltiples objetos Factory, cada uno con un name y una lista de products. Dado que getProducts() devuelve una lista, al llamar a stream() sobre factories normalmente se obtiene un stream de objetos Factory, lo cual no es lo que se necesita.

Para extraer los nombres de productos reales, se utiliza flatMap(factory -> factory.getProducts().stream()). Esto aplana todas las listas de productos en un único stream continuo de valores String.

Luego, map(String::toUpperCase) aplica el método toUpperCase() a cada nombre de producto, asegurando que todos los nombres estén en mayúsculas antes de recopilarlos en productList usando toList().

Unificación de colecciones en una sola

Cuando los datos están organizados como colecciones anidadas, el método flatMap() ayuda a unificarlas en un único stream, facilitando el procesamiento posterior. Por ejemplo, se puede combinar un array que contiene otros arrays en un solo array.

Ejemplo

Se dispone de varias líneas de producción, cada una fabricando varios productos. El objetivo es obtener una lista única de todos los productos producidos en estas líneas.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }

Este código utiliza flatMap() para fusionar listas anidadas de productos provenientes de diferentes líneas de producción en un único flujo unificado.

Cada línea de producción, representada como una lista de productos, se convierte en un flujo de elementos, que luego se recopila en una lista final usando toList(). Como resultado, se obtiene una lista única que contiene todos los productos fabricados en la fábrica.

1. ¿Qué hace el método flatMap() en la Stream API?

2. ¿Qué sucede al usar flatMap() con colecciones anidadas?

question mark

¿Qué hace el método flatMap() en la Stream API?

Select the correct answer

question mark

¿Qué sucede al usar flatMap() con colecciones anidadas?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 4

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

bookTrabajar con Estructuras Anidadas con el Método flatMap()

Desliza para mostrar el menú

Al trabajar con colecciones de datos en Java, a menudo se presentan situaciones donde nuestras estructuras están anidadas. Por ejemplo, puedes tener una lista de objetos, cada uno de los cuales contiene otra lista de objetos.

En estos casos, las operaciones estándar como map() no son adecuadas para extraer todos los datos anidados en un solo stream. Aquí es donde entra en juego el método flatMap() de la Stream API.

El método flatMap() recibe una función que transforma cada elemento del stream en un nuevo stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — el tipo de elementos en el stream resultante;
  • Function<? super T, ? extends Stream<? extends R>> mapper — una función que toma un elemento del stream original (T) y devuelve un stream (Stream<R>) de elementos resultantes.

Es importante comprender que flatMap() no devuelve simplemente un nuevo elemento, sino un stream (u otra colección) para cada elemento. Estos streams individuales luego se combinan en uno solo.

Aplicación práctica

Imagina que tienes varias fábricas, cada una produciendo diferentes tipos de productos. Nuestro objetivo es crear una lista unificada de todos los productos de estas fábricas y convertir sus nombres a mayúsculas.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }

La lista factories contiene múltiples objetos Factory, cada uno con un name y una lista de products. Dado que getProducts() devuelve una lista, al llamar a stream() sobre factories normalmente se obtiene un stream de objetos Factory, lo cual no es lo que se necesita.

Para extraer los nombres de productos reales, se utiliza flatMap(factory -> factory.getProducts().stream()). Esto aplana todas las listas de productos en un único stream continuo de valores String.

Luego, map(String::toUpperCase) aplica el método toUpperCase() a cada nombre de producto, asegurando que todos los nombres estén en mayúsculas antes de recopilarlos en productList usando toList().

Unificación de colecciones en una sola

Cuando los datos están organizados como colecciones anidadas, el método flatMap() ayuda a unificarlas en un único stream, facilitando el procesamiento posterior. Por ejemplo, se puede combinar un array que contiene otros arrays en un solo array.

Ejemplo

Se dispone de varias líneas de producción, cada una fabricando varios productos. El objetivo es obtener una lista única de todos los productos producidos en estas líneas.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }

Este código utiliza flatMap() para fusionar listas anidadas de productos provenientes de diferentes líneas de producción en un único flujo unificado.

Cada línea de producción, representada como una lista de productos, se convierte en un flujo de elementos, que luego se recopila en una lista final usando toList(). Como resultado, se obtiene una lista única que contiene todos los productos fabricados en la fábrica.

1. ¿Qué hace el método flatMap() en la Stream API?

2. ¿Qué sucede al usar flatMap() con colecciones anidadas?

question mark

¿Qué hace el método flatMap() en la Stream API?

Select the correct answer

question mark

¿Qué sucede al usar flatMap() con colecciones anidadas?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 4
some-alt