Funções em Java: Explorando o Potencial do Map em Java
No vasto mundo da programação Java, quanto mais ferramentas dominamos, melhor conseguimos desempenhar nossas tarefas do dia-a-dia. Nesse artigo, vamos explorar o potencial da estrutura Map, que se destaca como uma ferramenta essencial para mapear chaves e valores únicos. Seu papel é crucial para armazenar e recuperar dados de maneira eficiente, com base em chaves associadas.
Vamos mergulhar nesse universo e descobrir como aproveitar ao máximo o poder do Map em Java, através de exemplos práticos e uma abordagem detalhada de seu funcionamento.
O Map em Java é uma interface que faz parte do Java Collections Framework e é representada por pares chave-valor, onde cada chave está associada a um único valor. Ele permite armazenar e recuperar dados eficientemente com base em chaves exclusivas, evitando duplicatas. Isso garante uma relação de um-para-um entre as chaves e os valores correspondentes.
Com uma variedade de métodos disponíveis para adicionar (put()), remover (remove()), obter (get()) e manipular pares chave-valor (size(), containsKey(), containsValue(), etc), o Map é uma estrutura de dados versátil e poderosa para diversas aplicações na programação.
O Map, como interface, possui uma série de implementações com diferentes comportamentos e características para atender às diferentes necessidades de programação. Eis apenas algumas delas:
- AbstractMap: Classe abstrata que fornece implementações parciais de muitos métodos da interface Map. Outras classes Map como HashMap, TreeMap, etc., estendem ou implementam AbstractMap.
- HashMap: Implementação de Map baseada em tabela de dispersão. Não garante a ordem dos elementos.
- LinkedHashMap: Implementação de Map que mantém a ordem de inserção dos elementos.
- TreeMap: Implementação de Map baseada em árvore de busca binária que mantém os elementos ordenados de acordo com a ordem natural das chaves ou por um comparador fornecido.
- WeakHashMap: Implementação de Map que usa referências fracas para as chaves. Isso permite que as chaves sejam coletadas pelo coletor de lixo se não forem referenciadas em nenhum outro lugar.
- IdentityHashMap: Implementação de Map que usa comparação de identidade em vez de igualdade para comparar chaves.
https://www.knowledgefactory.net/2019/10/java-map-interface-hierarchy-examples.html
Para criar um Map, basta seguir esta sintaxe básica, onde TipoChave representa o tipo de dados das chaves e TipoValor representa o tipo de dados dos valores:
Map<TipoChave, TipoValor> nomeDoMap = new HashMap<>();
Agora chega de teoria e vamos partir pra a prática com dois exemplos simples mas que dão uma boa ideia de como utilizar o recurso.
Exemplo 1: Notas dos alunos
Vamos imaginar uma situação em que precisamos armazenar as notas dos alunos usando um Map:
import java.util.*;
public class Main {
public static void main(String[] args) {
Map<String, Double> notasDosAlunos = new HashMap<>();
notasDosAlunos.put("João", 8.5);
notasDosAlunos.put("Maria", 9.0);
notasDosAlunos.put("José", 7.5);
// Acessando valores no Map
System.out.println("Nota de João: " + notasDosAlunos.get("João"));
// Iterando sobre os elementos do Map
for (Map.Entry<String, Double> entrada : notasDosAlunos.entrySet()) {
System.out.println("Aluno: " + entrada.getKey() + ", Nota: " + entrada.getValue());
}
}
}
No exemplo acima, criamos um Map chamado "notasDosAlunos" para armazenar as notas de diferentes alunos. Utilizamos o método put() para adicionar elementos ao Map e o método get() para acessar a nota associada a uma chave específica. Além disso, exploramos a iteração sobre os elementos do Map utilizando um loop for-each e o método entrySet().
Exemplo 2: contagem de itens
Suponha que tenhamos uma lista de nomes de produtos e que desejamos contar quantas vezes cada produto aparece na lista. Suponha também que fizemos uma consulta ao banco de dados para obter a contagem de ocorrências de cada produto. Podemos então armazenar esses resultados em um Map, onde as chaves são os nomes dos produtos e os valores são as contagens correspondentes.
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// Suponha que os resultados da consulta ao banco de dados sejam os seguintes:
Map<String, Integer> resultadosDoBanco = new HashMap<>();
resultadosDoBanco.put("Produto A", 5);
resultadosDoBanco.put("Produto B", 3);
resultadosDoBanco.put("Produto C", 7);
// Lista de nomes de produtos
String[] listaDeProdutos = {"Produto A", "Produto B", "Produto A", "Produto C", "Produto A", "Produto C"};
// Contagem de ocorrências de cada produto na lista
Map<String, Integer> contagemDeProdutos = new HashMap<>();
for (String produto : listaDeProdutos) {
// Verifica se o produto está presente nos resultados do banco
if (resultadosDoBanco.containsKey(produto)) {
// Se estiver, obtém a contagem do banco
int contagem = resultadosDoBanco.get(produto);
contagemDeProdutos.put(produto, contagem);
} else {
// Caso contrário, inicializa a contagem como 0
contagemDeProdutos.put(produto, 0);
}
}
// Exibe a contagem de ocorrências de cada produto
for (Map.Entry<String, Integer> entry : contagemDeProdutos.entrySet()) {
System.out.println("Produto: " + entry.getKey() + ", Ocorrências: " + entry.getValue());
}
}
}
Neste exemplo, a variável resultadosDoBanco simula os resultados da consulta ao banco de dados, onde cada chave é o nome do produto e cada valor é a contagem de ocorrências desse produto. Em seguida, percorremos a lista de produtos e verificamos se o produto está presente nos resultados do banco. Se estiver, obtemos a contagem correspondente; caso contrário, inicializamos a contagem como 0. Finalmente, exibimos a contagem de ocorrências de cada produto.
Importanto observar que nesse exemplo usamos outras estruturas importantes no java. Além do Map, estamos utilizando um Array(String[] listaDeProdutos) e estruturas de controle como o loop for(for (String produto : listaDeProdutos)) e if-else para realizar a contagem de ocorrências de cada produto na lista fornecida, mas a explicação de cada um vai ficar para outra hora! ;)
Um ponto de atenção é que, já que não é possível valores duplicados, ao adicionar uma chave igual à outra que já existe no Map, o valor correspondente será substituído pelo novo.
Outro detalhe que é destacado na documentação quanto aos tipos e valores que podem ser informados:
Algumas implementações de mapas têm restrições quanto às chaves e valores que podem conter. Por exemplo, algumas implementações proíbem chaves e valores nulos e algumas têm restrições quanto aos tipos de suas chaves. (Traduzido)
Conclusão
O Map em Java é uma ferramenta valiosa para organizar e recuperar dados de forma eficiente, tornando-se um aliado essencial para desenvolvedores Java. Neste artigo, exploramos sua sintaxe básica, oferecemos um exemplo prático e elucidamos seu funcionamento. Ao dominar o Map, os programadores Java podem manipular conjuntos de dados associativos com facilidade e eficiência.
Referências:
https://docs.oracle.com/en%2Fjava%2Fjavase%2F11%2Fdocs%2Fapi%2F%2F/java.base/java/util/Map.html