Como adicionar um elemento a um Map dentro de um loop?

O meu objetivo é percorrer um HashMap e verificar se uma chave na estrutura, caso exista quero alterar o valor dessa chave. Mas propositalmente a chave não existe e devo criar um elemento dentro do loop para ser adicionado ao HashMap.

O problema que encontrei é que não foi permitido alterar o meu HashMap dentro do loop for.

A solução que encontrei foi no StackOverFlow, porém é datado de 2015 e não sei uma forma melhor atualmente.

Segue a implementação:

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> personsMap = new HashMap<>();
        Person p1 = new Person("Daniel", 23);
        Person p2 = new Person("Jose", 61);
        Person p3 = new Person("Maria", 31);

        personsMap.put(p1.getName(), p1.getAge());
        personsMap.put(p2.getName(), p2.getAge());
        personsMap.put(p3.getName(), p3.getAge());

        System.out.println(personsMap);

        Map<String, Integer> temp = new HashMap<>();
        for (Map.Entry<String, Integer> entry : personsMap.entrySet()) {
            if (entry.getKey().equalsIgnoreCase("Mateus")) {
                entry.setValue(25);
            } else {
                Person px = new Person("Mateus", 25);
                temp.put(px.getName(), px.getAge());
            }
        }

        personsMap.putAll(temp);

}

Basicamente, a solução acima sugere criar uma HashMap auxiliar e depois “copiar” os seus elementos para o HashMap principal.

Existe uma forma mais simples?

discussão no StackOverFlow: iterator - Java HashMap add new entry while iterating - Stack Overflow

Me parece que sua situação é o chamado Problema XY.

Seu objetivo não parece ser “percorrer um HashMap” e sim “se uma chave existir, atualizar o valor, se não existir, adicionar o valor”

Não é preciso percorrer um HashMap pra resolver isso, um Map já tem métodos que ajudam nesse tipo de caso.
Para ter esse exato comportamento que você quer, você pode mudar o seguinte trecho no seu código:

// Na hora de adicionar elementos no mapa já normaliza a chave. 
// Assim já compara igual o "equalsIgnoreCase":
personsMap.put(p1.getName().toLowerCase(), p1.getAge());
personsMap.put(p2.getName().toLowerCase(), p2.getAge());
personsMap.put(p3.getName().toLowerCase(), p3.getAge());

// Agora para adicionar um novo valor ou atualizar, basta usar o método put do mapa novamente:
Person px = new Person("Mateus", 25);
personsMap.put(px.getName().toLowerCase(), px.getAge());

Usando dessa forma o put já faz o que você queria.

2 curtidas