Classe Utilitária Collectors para Stream API
Deslize para mostrar o menu
O método collect() na Stream API já é conhecido como uma ferramenta poderosa para reunir elementos de stream em estruturas de dados convenientes. No entanto, o próprio collect() exige uma implementação de Collector, o que pode tornar o processo mais complexo.
É nesse ponto que a classe Collectors se torna útil, fornecendo um conjunto de implementações pré-construídas para as operações mais comuns. Ela simplifica tarefas como coletar dados em coleções, agrupamento e contagem, tornando essas operações muito mais diretas.
Principais Métodos da Classe Collectors
A classe Collectors oferece diversas soluções prontas, eliminando a necessidade de implementar manualmente um Collector. A seguir, alguns dos principais métodos:
A Stream API também oferece o método embutido toList(), que já foi utilizado anteriormente. Este método possui uma sintaxe concisa, tornando-se a opção preferida. No entanto, é possível utilizar qualquer implementação que melhor atenda às necessidades.
Convertendo uma Lista em um Map
Suponha que você tenha uma lista de produtos com seus preços, armazenados como strings no formato Name=Price. O objetivo é criar um Map onde a chave é o nome do produto e o valor é o seu preço.
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); } }
Aqui, utiliza-se toMap() para dividir cada string (split("=")) e criar um Map<String, Integer>, onde a chave é o nome do produto e o valor é o seu preço como inteiro. Por exemplo, a string Laptop=1500 transforma-se em uma entrada Laptop -> 1500.
Agrupamento de Produtos pela Primeira Letra
Agrupamento de produtos pela primeira letra para identificar quais itens começam com a mesma 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); } }
O programa cria uma List de nomes de produtos e os agrupa pela primeira letra utilizando groupingBy(). O resultado é armazenado em um Map, onde a chave é charAt(0) e o valor é uma lista de produtos correspondentes. Por fim, os produtos agrupados são exibidos.
Dividindo Preços
Collectors.partitioningBy é um collector especial na Stream API que divide os elementos em dois grupos com base em um predicado fornecido.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Ele retorna um Map<Boolean, List<T>>, onde true representa os elementos que atendem à condição, e false representa aqueles que não atendem.
Isso é útil para separar dados, como filtrar números pares e ímpares ou produtos de preço alto e baixo.
Exemplo
Vamos dividir os preços dos produtos em duas categorias: caros (maiores que $1000) e baratos ($1000 ou 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)); } }
O método partitioningBy() divide a lista de preços em dois grupos. Se um preço for maior que 1000, ele é colocado sob a chave true; caso contrário, fica sob false.
Contagem de Produtos
Contagem de produtos que começam com a mesma 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); } }
O programa processa a List de produtos utilizando stream(), depois aplica groupingBy() com charAt(0) para agrupar as palavras pela primeira letra. O coletor counting() conta quantos produtos pertencem a cada grupo, e o Map final armazena a letra como chave e a quantidade como valor.
Juntando nomes de produtos
Concatenar nomes de produtos em uma única string, separando-os por vírgulas.
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); } }
O método Collectors.joining(", ") concatena todos os nomes dos produtos em uma única string, separando-os por vírgulas. Por fim, a string resultante é impressa para exibir a lista de produtos em um formato legível.
1. O que o seguinte código faz?
2. Qual método de Collectors deve ser utilizado para agrupar produtos pela primeira letra?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo