Article image
Miquéias Silva
Miquéias Silva07/02/2024 11:21
Compartilhe

Explorando o Map em Java: Como utilizar esta função poderosa para manipular coleções de dados

  • #Java

Introdução:

O Java é uma linguagem de programação amplamente utilizada no desenvolvimento de aplicativos e sistemas. Uma das características poderosas do Java é a sua capacidade de manipular coleções de dados de forma eficiente.

O Map é uma das estruturas de dados mais importantes no Java, permitindo associar pares de chave-valor. Neste artigo, vamos explorar o Map em Java e aprender como utilizá-lo para manipular coleções de dados.

O que é um Map?

O Map é uma interface do Java que representa uma coleção de pares de chave-valor. Cada chave é única dentro do Map e está associada a um valor específico.

O Map permite que se armazene, recupere e manipule elementos com base em suas chaves. Isso significa que podemos procurar valores usando as chaves correspondentes, sem a necessidade de percorrer toda a coleção.

Exemplo básico de utilização do Map

Aqui está um exemplo básico de como usar os Map em Java:

      
import java.util.HashMap;
import java.util.Map;
          
public class ExemploMap {
    public static void main(String[] args) {
         // Cria um novo Map
         Map map = new HashMap<>();
                  
         // Adiciona elementos ao Map
         map.put("chave1", 10);
         map.put("chave2", 20);
         map.put("chave3", 30);
                  
         // Acessa elementos do Map
         System.out.println(map.get("chave1")); // Saída: 10
         System.out.println(map.get("chave2")); // Saída: 20
         System.out.println(map.get("chave3")); // Saída: 30
     }
}
      
  

Neste exemplo, criamos um novo Map utilizando a implementação HashMap. Estamos adicionando elementos ao Map usando o método put, onde especificamos a chave e o valor correspondente. Em seguida, podemos acessar os elementos do Map usando a chave com o método get.

Vantagens do uso do Map

O Map é uma estrutura de dados extremamente útil e versátil no Java. Algumas vantagens de utilizar o Map incluem:

  • Recuperação rápida de valores com base nas chaves.
  • Capacidade de armazenar dados de forma associativa.
  • Flexibilidade para adicionar, remover e atualizar elementos.
  • Facilidade de percorrer os elementos do Map.
  • Permite a aplicação de algoritmos específicos para manipular os dados.

O uso do Map pode simplificar o código e melhorar a eficiência ao manipular coleções de dados.

Utilizando o Map em Java para manipular coleções de dados. O Map é uma estrutura de dados poderosa que permite armazenar pares chave-valor, onde cada chave é única e associada a um valor.

Vamos ver como aproveitar essa função em diferentes cenários. Manipulando elementos em um Map, para manipular elementos em um Map, podemos utilizar métodos específicos como put(), get(), remove() e size() . Veja um exemplo:

// Criando um Map 
Map mapa = new HashMap<>(); 

// Adicionando elementos ao Map 
mapa.put("Maçã", 3); 
mapa.put("Banana", 5); 
mapa.put("Laranja", 2); 

// Acessando valores do Map 
int quantidadeMaca = mapa.get("Maçã"); 
System.out.println("Quantidade de maçãs: " + quantidadeMaca); 

// Removendo um elemento do Map 
mapa.remove("Banana"); 

// Verificando o tamanho do Map 
int tamanhoMapa = mapa.size(); 
System.out.println("Tamanho do mapa: " + tamanhoMapa);  

Iterando sobre um Map Para percorrer os elementos de um Map, podemos utilizar um loop for-each ou utilizar o método keySet() para obter um conjunto das chaves. Veja um exemplo:

import java.util.*;

public class ExemploPercorrendoMap {
  public static void main(String[] args) {
      // Criando um Map com valores iniciais
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("Maçã", 3);
      mapa.put("Banana", 5);
      mapa.put("Laranja", 2);

      // Percorrendo elementos do Map com for-each
      // Para cada entrada (entry) no conjunto de entradas (entrySet) do mapa
      for (Map.Entry<String, Integer> entry : mapa.entrySet()) {
          String chave = entry.getKey(); // Obtendo a chave da entrada
          int valor = entry.getValue(); // Obtendo o valor da entrada
          System.out.println("Chave: " + chave + ", Valor: " + valor);
      }

      // Percorrendo elementos do Map utilizando keySet()
      // Obtendo o conjunto de chaves (keySet) do mapa
      Set<String> chaves = mapa.keySet();

      // Para cada chave (chave) no conjunto de chaves
      for (String chave : chaves) {
          int valor = mapa.get(chave); // Obtendo o valor associado à chave
          System.out.println("Chave: " + chave + ", Valor: " + valor);
      }
  }
}


Transformando um Map em uma lista, é possível obter uma lista com os valores de um Map utilizando o método values(). Veja um exemplo:

import java.util.*;

public class ExemploObtencaoListaValores {
  public static void main(String[] args) {
      // Criando um Map com valores iniciais
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("Maçã", 3);
      mapa.put("Banana", 5);
      mapa.put("Laranja", 2);

      // Obtendo uma lista dos valores do Map
      // Criando uma lista (valores) e adicionando todos os valores do mapa a essa lista
      List<Integer> valores = new ArrayList<>(mapa.values());

      // Iterando sobre a lista de valores e imprimindo cada valor
      for (int valor : valores) {
          System.out.println("Valor: " + valor);
      }
  }
}

Realizando operações em lote O Map também permite realizar operações em lote nos elementos. Veja um exemplo de como incrementar os valores do Map utilizando o método compute():

import java.util.*;

public class ExemploIncrementoMap {
  public static void main(String[] args) {
      // Criando um Map com valores iniciais
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("Maçã", 3);
      mapa.put("Banana", 5);
      mapa.put("Laranja", 2);

      // Incrementando valores do Map
      // Para cada chave (chave) e valor (valor) no mapa, use o método compute para incrementar o valor
      mapa.forEach((chave, valor) -> mapa.compute(chave, (k, v) -> v + 1));

      // Imprimindo os novos valores
      // Para cada chave (chave) e valor (valor) no mapa, imprima a chave e o valor
      mapa.forEach((chave, valor) -> System.out.println("Chave: " + chave + ", Valor: " + valor));
  }
}

O Map em Java é uma função poderosa para manipular coleções de dados de forma eficiente. Até aqui exploramos diversos exemplos de como utilizar o Map para adicionar, acessar, remover e percorrer elementos, além de transformar o Map em uma lista e realizar operações em lote.

Dicas de Uso do Map em Java:

Maneiras criativas de utilizar a função Map em Java, já vimos que Map é uma estrutura de dados poderosa que permite associar pares de chave-valor. Além das operações básicas de inserção, remoção e consulta de elementos, assim podemos perceber que o Map fornece diversas funcionalidades avançadas para manipulação de coleções de dados.

Nesta seção, vamos explorar algumas dicas e exemplos de uso do Map em situações reais:

1. Contagem de ocorrências: O Map é uma ótima opção para contar o número de ocorrências de determinados elementos em uma coleção de dados. Por exemplo, suponha que você tenha uma lista de palavras e queira contar quantas vezes cada palavra aparece. Veja o exemplo de código:

import java.util.*;

public class ExemploContadorPalavras {
  public static void main(String[] args) {
      Map<String, Integer> contadorPalavras = new HashMap<>();

      List<String> palavras = Arrays.asList("banana", "maçã", "banana", "laranja", "banana");

      for (String palavra : palavras) {
          contadorPalavras.put(palavra, contadorPalavras.getOrDefault(palavra, 0) + 1);
      }

      System.out.println(contadorPalavras);
  }
}
Saída: {banana=3, maçã=1, laranja=1} 

2. Agrupamento de elementos: O Map também pode ser utilizado para agrupar elementos de acordo com determinado critério. Suponha que você tenha uma lista de objetos do tipo Produto e queira agrupá-los por categoria. Veja o exemplo:

import java.util.*;

// Definição da classe Produto
class Produto {
  String nome;
  String categoria;

  // Construtor da classe Produto
  public Produto(String nome, String categoria) {
      this.nome = nome;
      this.categoria = categoria;
  }

  // Getter para obter a categoria do produto
  public String getCategoria() {
      return categoria;
  }

  // Método toString para criar uma representação de string legível
  @Override
  public String toString() {
      return "Produto{" +
              "nome='" + nome + '\'' +
              ", categoria='" + categoria + '\'' +
              '}';
  }
}

// Classe principal ExemploAgrupamento
public class ExemploAgrupamento {
  public static void main(String[] args) {
      // Criando uma lista de produtos
      List<Produto> produtos = Arrays.asList(
              new Produto("Notebook", "Eletrônicos"),
              new Produto("Smartphone", "Eletrônicos"),
              new Produto("Mesa", "Móveis"),
              new Produto("Cadeira", "Móveis"),
              new Produto("Livro", "Livros")
      );

      // Criando um mapa para agrupar produtos por categoria
      Map<String, List<Produto>> produtosPorCategoria = new HashMap<>();

      // Iterando sobre a lista de produtos
      for (Produto produto : produtos) {
          String categoria = produto.getCategoria();

          // Se a categoria ainda não estiver no mapa, adiciona uma nova lista
          produtosPorCategoria.computeIfAbsent(categoria, k -> new ArrayList<>()).add(produto);
      }

      // Imprimindo os produtos organizados por categoria
      for (Map.Entry<String, List<Produto>> entry : produtosPorCategoria.entrySet()) {
          String categoria = entry.getKey();
          List<Produto> produtosDaCategoria = entry.getValue();

          System.out.println("Categoria: " + categoria);
          
          // Iterando sobre os produtos dentro da categoria
          for (Produto produto : produtosDaCategoria) {
              System.out.println("  - " + produto);
          }
      }
  }
}
Saída: 

Categoria: Livros
- Produto{nome='Livro', categoria='Livros'}
Categoria: Móveis
- Produto{nome='Mesa', categoria='Móveis'}
- Produto{nome='Cadeira', categoria='Móveis'}
Categoria: Eletrônicos
- Produto{nome='Notebook', categoria='Eletrônicos'}
- Produto{nome='Smartphone', categoria='Eletrônicos'}

3. Realização de mapeamentos complexos: Além das funcionalidades básicas do Map, também podemos utilizar a interface Map para criar mapeamentos complexos. Por exemplo, podemos associar uma lista de valores a cada chave do Map, criando assim uma estrutura de dados mais elaborada. Veja o exemplo:

Map<String, List<Integer>> notasPorAluno = new HashMap<>();

notasPorAluno.put("João", Arrays.asList(7, 8, 9));
notasPorAluno.put("Maria", Arrays.asList(6, 7, 8));
notasPorAluno.put("Pedro", Arrays.asList(8, 7, 6));

for (Map.Entry<String, List<Integer>> entry : notasPorAluno.entrySet()) {
  String aluno = entry.getKey();
  List<Integer> notas = entry.getValue();
  System.out.println(aluno + ": " + notas);
}
Saída: 

João: [7, 8, 9] 
Pedro: [8, 7, 6] 
Maria: [6, 7, 8] 

Essas são apenas algumas das muitas maneiras criativas de utilizar o Map em Java. Com a versatilidade dessa estrutura de dados, podemos resolver diversos problemas de forma simples e eficiente. Experimente explorar mais recursos do Map para facilitar a manipulação de coleções de dados.

Funcionamento da função Map em Java

Já deu para perceber que a função Map em Java é uma das funções de transformação mais poderosas disponíveis na linguagem. Ela permite manipular e alterar coleções de dados de forma eficiente e flexível.

Vamos recapitular para melhor entendimento, para utilizar a função Map, primeiro é necessário criar uma instância de um Map. Segue um exemplo de criação de um Map utilizando a implementação HashMap:

Map<String, Integer> mapa = new HashMap<>();

Após criar o mapa, é possível adicionar pares chave-valor utilizando o método put. Segue um exemplo:

mapa.put("Maçã", 10);
mapa.put("Laranja", 5);
mapa.put("Banana", 12);

Uma vez que os dados estejam presentes no mapa, é possível realizar diferentes operações utilizando a função Map. Um exemplo comum é percorrer todos os elementos do mapa utilizando um laço de repetição, como já foi visto aqui:

import java.util.Map;
import java.util.HashMap;

public class ExemploMapLoop {
  public static void main(String[] args) {
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("João", 7);
      mapa.put("Maria", 8);
      mapa.put("Pedro", 6);

      for (Map.Entry<String, Integer> entry : mapa.entrySet()) {
          String chave = entry.getKey();
          Integer valor = entry.getValue();

          // Realizar operações com chave e valor
          System.out.println("Chave: " + chave + ", Valor: " + valor);
          // Adicione outras operações conforme necessário
      }
  }
}

Além disso, também é possível utilizar a função Map para realizar operações de filtragem, mapeamento e redução nos elementos do mapa. A função filter, por exemplo, permite filtrar os elementos com base em determinados critérios:

import java.util.Map;
import java.util.HashMap;

public class ExemploMapFilter {
  public static void main(String[] args) {
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("João", 7);
      mapa.put("Maria", 8);
      mapa.put("Pedro", 6);

      mapa.entrySet().stream()
          .filter(entry -> entry.getValue() > 5)
          .forEach(entry -> System.out.println(entry.getKey()));
  }
}

No exemplo acima, estamos filtrando as entradas do mapa que possuem valores maiores que 5 e imprimindo suas chaves, assim agente sabe que os três alunos passaram de ano.

Outra operação comum é o mapeamento, que consiste em transformar os valores do mapa de acordo com uma função fornecida. Segue um exemplo utilizando a função map:

import java.util.Map;
import java.util.HashMap;

public class ExemploMapMultiply {
  public static void main(String[] args) {
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("João", 7);
      mapa.put("Maria", 8);
      mapa.put("Pedro", 6);

      mapa.entrySet().stream()
          .map(entry -> entry.getValue() * 2)
          .forEach(System.out::println);
  }
}

No exemplo acima, estamos mapeando os valores do mapa para serem multiplicados por 2 e imprimindo o resultado.

Por fim, a função Map também suporta a operação de redução, que permite combinar todos os elementos do mapa em um único valor. Segue um exemplo utilizando a função reduce:

import java.util.Map;
import java.util.HashMap;

public class ExemploReduce {
  public static void main(String[] args) {
      Map<String, Integer> mapa = new HashMap<>();
      mapa.put("João", 7);
      mapa.put("Maria", 8);
      mapa.put("Pedro", 6);

      int soma = mapa.entrySet()
          .stream()
          .map(entry -> entry.getValue())
          .reduce(0, Integer::sum);

      System.out.println("Soma: " + soma);
  }
}

No exemplo acima, estamos realizando a redução dos valores do mapa para obter a soma total e imprimindo o resultado.

Assim percebemos que a função Map em Java é uma ferramenta poderosa para a manipulação e transformação de coleções de dados. Ela permite realizar operações de filtragem, mapeamento e redução de forma eficiente, proporcionando uma maior flexibilidade no tratamento dos dados.

Map é show!!!

Segue o link da documentação completa: https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

Compartilhe
Comentários (2)

RS

Rosalia Santos - 07/02/2024 14:20


RS

Rosalia Santos - 07/02/2024 14:19

Gostei muito desse