Trabalhando com Estruturas Aninhadas com o Método flatMap()
Ao trabalhar com coleções de dados em Java, frequentemente surgem situações em que nossas estruturas estão aninhadas. Por exemplo, pode-se ter uma lista de objetos, cada um contendo outra lista de objetos.
Nesses casos, operações padrão como map() não são adequadas para extrair todos os dados aninhados em um único stream. É nesse contexto que o método flatMap() da Stream API se torna útil.
O método flatMap() recebe uma função que transforma cada elemento do stream em um novo stream.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— o tipo dos elementos no stream resultante;Function<? super T, ? extends Stream<? extends R>> mapper— uma função que recebe um elemento do stream original (T) e retorna um stream (Stream<R>) de elementos resultantes.
É importante compreender que flatMap() não retorna simplesmente um novo elemento, mas sim um stream (ou outra coleção) para cada elemento. Esses streams individuais são então combinados em um só.
Aplicação Prática
Imagine que você possui várias fábricas, cada uma produzindo diferentes tipos de produtos. O objetivo é criar uma lista unificada de todos os produtos dessas fábricas e converter seus nomes para maiúsculas.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
A lista factories contém múltiplos objetos Factory, cada um com um name e uma lista de products. Como getProducts() retorna uma lista, ao chamar stream() em factories, normalmente obteríamos um stream de objetos Factory, o que não é o desejado.
Para extrair os nomes reais dos produtos, utiliza-se flatMap(factory -> factory.getProducts().stream()). Isso achata todas as listas de produtos em um único stream contínuo de valores String.
Em seguida, map(String::toUpperCase) aplica o método toUpperCase() a cada nome de produto, garantindo que todos os nomes estejam em maiúsculas antes de coletá-los em productList usando toList().
Mesclando Coleções em Uma Só
Quando os dados estão organizados como coleções aninhadas, o método flatMap() auxilia a mesclá-las em um único stream, facilitando o processamento posterior. Por exemplo, é possível combinar um array que contém outros arrays em um único array.
Exemplo
Você possui várias linhas de produção, cada uma fabricando diversos produtos. O objetivo é obter uma lista única de todos os produtos produzidos nessas linhas.
Main.java
12345678910111213141516171819202122package 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 mesclar listas aninhadas de produtos provenientes de diferentes linhas de produção em um único fluxo unificado.
Cada linha de produção, representada como uma lista de produtos, é convertida em um stream de elementos, que então é coletado em uma lista final usando toList(). Como resultado, obtém-se uma lista única contendo todos os produtos fabricados na fábrica.
1. O que o método flatMap() faz na Stream API?
2. O que acontece ao usar flatMap() com coleções aninhadas?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.33
Trabalhando com Estruturas Aninhadas com o Método flatMap()
Deslize para mostrar o menu
Ao trabalhar com coleções de dados em Java, frequentemente surgem situações em que nossas estruturas estão aninhadas. Por exemplo, pode-se ter uma lista de objetos, cada um contendo outra lista de objetos.
Nesses casos, operações padrão como map() não são adequadas para extrair todos os dados aninhados em um único stream. É nesse contexto que o método flatMap() da Stream API se torna útil.
O método flatMap() recebe uma função que transforma cada elemento do stream em um novo stream.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— o tipo dos elementos no stream resultante;Function<? super T, ? extends Stream<? extends R>> mapper— uma função que recebe um elemento do stream original (T) e retorna um stream (Stream<R>) de elementos resultantes.
É importante compreender que flatMap() não retorna simplesmente um novo elemento, mas sim um stream (ou outra coleção) para cada elemento. Esses streams individuais são então combinados em um só.
Aplicação Prática
Imagine que você possui várias fábricas, cada uma produzindo diferentes tipos de produtos. O objetivo é criar uma lista unificada de todos os produtos dessas fábricas e converter seus nomes para maiúsculas.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
A lista factories contém múltiplos objetos Factory, cada um com um name e uma lista de products. Como getProducts() retorna uma lista, ao chamar stream() em factories, normalmente obteríamos um stream de objetos Factory, o que não é o desejado.
Para extrair os nomes reais dos produtos, utiliza-se flatMap(factory -> factory.getProducts().stream()). Isso achata todas as listas de produtos em um único stream contínuo de valores String.
Em seguida, map(String::toUpperCase) aplica o método toUpperCase() a cada nome de produto, garantindo que todos os nomes estejam em maiúsculas antes de coletá-los em productList usando toList().
Mesclando Coleções em Uma Só
Quando os dados estão organizados como coleções aninhadas, o método flatMap() auxilia a mesclá-las em um único stream, facilitando o processamento posterior. Por exemplo, é possível combinar um array que contém outros arrays em um único array.
Exemplo
Você possui várias linhas de produção, cada uma fabricando diversos produtos. O objetivo é obter uma lista única de todos os produtos produzidos nessas linhas.
Main.java
12345678910111213141516171819202122package 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 mesclar listas aninhadas de produtos provenientes de diferentes linhas de produção em um único fluxo unificado.
Cada linha de produção, representada como uma lista de produtos, é convertida em um stream de elementos, que então é coletado em uma lista final usando toList(). Como resultado, obtém-se uma lista única contendo todos os produtos fabricados na fábrica.
1. O que o método flatMap() faz na Stream API?
2. O que acontece ao usar flatMap() com coleções aninhadas?
Obrigado pelo seu feedback!