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
Quizzes & Challenges
Quizzes
Challenges
/
Stream API

bookClasse 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

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?

Select the correct answer

question mark

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

Select the correct answer

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

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?

Select the correct answer

question mark

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

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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