Map.replace în Java

replace schimbă valoarea unei chei doar dacă cheia există; replaceAll recalculează toate valorile cu o funcție.

Sintaxă
default V replace(K key, V value)
default boolean replace(K key, V oldValue, V newValue)
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

Ce face Map.replace

replace(cheie, valoare) este ca put, dar nu adaugă chei noi: dacă cheia lipsește, nu face nimic și returnează null. Varianta replace(cheie, veche, noua) schimbă valoarea doar dacă era exact veche și returnează true/false.

replaceAll((k, v) -> ...) trece prin toate perechile și pune ca valoare nouă rezultatul funcției. Cheile rămân aceleași. Este felul simplu de a aplica o majorare de preț, o rotunjire sau o conversie tuturor valorilor.

Parametri

Parametru Descriere
key Cheia a cărei valoare se schimbă.
oldValue / newValue Valoarea așteptată și valoarea nouă.
function Funcția care primește cheia și valoarea și returnează valoarea nouă.

Ce returnează

replace(k, v): valoarea veche sau null. replace(k, veche, noua): boolean. replaceAll: nimic.

Exemple

Exemplul 1: Schimbare de preț doar pentru produse existente

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> preturi = new TreeMap<>(Map.of("pâine", 5, "lapte", 8));
        System.out.println(preturi.replace("lapte", 9));
        System.out.println(preturi.replace("cafea", 30));   // nu există, nu se adaugă
        System.out.println(preturi.replace("pâine", 4, 6)); // prețul nu era 4
        System.out.println(preturi.replace("pâine", 5, 6));
        System.out.println(preturi);
    }
}

Rezultat

8
null
false
true
{lapte=9, pâine=6}

Exemplul 2: Majorare de 10% pentru toate prețurile

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Double> preturi = new TreeMap<>(Map.of("ciorbă", 18.0, "sarmale", 30.0, "papanași", 20.0));
        preturi.replaceAll((produs, pret) -> Math.round(pret * 1.10 * 100) / 100.0);
        System.out.println(preturi);

        Map<String, String> orase = new TreeMap<>(Map.of("is", "iași", "cj", "cluj"));
        orase.replaceAll((cod, nume) -> cod.toUpperCase() + " - " + nume.substring(0, 1).toUpperCase() + nume.substring(1));
        System.out.println(orase);
    }
}

Rezultat

{ciorbă=19.8, papanași=22.0, sarmale=33.0}
{cj=CJ - Cluj, is=IS - Iași}

Greșeli frecvente

  • Folosești replace ca să adaugi o cheie nouă. Nu adaugă nimic; folosește put.
  • În replaceAll încerci să schimbi cheile. Funcția poate schimba doar valorile; pentru chei noi, construiește un map nou.

Comenzi înrudite

  • Map.put: put adaugă o pereche cheie → valoare sau înlocuiește valoarea unei chei existente; putAll copiază toate perechile altui map.
  • Map.compute: compute recalculează valoarea unei chei pornind de la cea veche (sau null); computeIfPresent o face doar dacă cheia există.
  • List.replaceAll: Înlocuiește fiecare element al listei cu rezultatul unei funcții aplicate pe el, pe loc.
  • Map.merge: Pune valoarea dacă cheia lipsește; dacă există, combină valoarea veche cu cea nouă (de exemplu le adună). Ideal pentru numărători și totaluri.