Classe Utilitária Collectors para Stream API
O método collect() na Stream API já é conhecido como uma ferramenta poderosa para reunir elementos de streams 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.
Métodos Principais da Classe Collectors
A classe Collectors oferece diversas soluções prontas, eliminando a necessidade de implementar manualmente um Collector. A seguir estão 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 suas necessidades.
Convertendo uma Lista em um Map
Considere 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));
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 a chave false.
Contagem de Produtos
Vamos contar quantos produtos 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
Vamos concatenar os nomes dos 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 código a seguir faz?
2. Qual método de Collectors deve ser usado 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
Awesome!
Completion rate improved to 2.33
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 streams 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.
Métodos Principais da Classe Collectors
A classe Collectors oferece diversas soluções prontas, eliminando a necessidade de implementar manualmente um Collector. A seguir estão 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 suas necessidades.
Convertendo uma Lista em um Map
Considere 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));
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 a chave false.
Contagem de Produtos
Vamos contar quantos produtos 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
Vamos concatenar os nomes dos 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 código a seguir faz?
2. Qual método de Collectors deve ser usado para agrupar produtos pela primeira letra?
Obrigado pelo seu feedback!