Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Classe Utilitária Collectors para Stream API | Operações Terminais na Stream API
Stream API

bookClasse 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

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); } }

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

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); } }

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

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)); } }

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

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); } }

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

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); } }

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?

question mark

O que o código a seguir faz?

Selecione a resposta correta

question mark

Qual método de Collectors deve ser usado para agrupar produtos pela primeira letra?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 3. Capítulo 3
some-alt