Map.keySet în Java

keySet() dă mulțimea cheilor unui map, values() colecția valorilor. Sunt vederi legate de map, nu copii.

Sintaxă
Set<K> keySet()
Collection<V> values()

Ce face Map.keySet

keySet() returnează un Set cu toate cheile, iar values() o Collection cu toate valorile (care se pot repeta). Ordinea lor este ordinea map-ului: sortată la TreeMap, a adăugării la LinkedHashMap, nespecificată la HashMap.

Amândouă sunt vederi: dacă map-ul se schimbă, vederea se schimbă și ea, iar dacă ștergi din vedere (remove, removeIf, retainAll), se șterg perechile din map. Nu poți adăuga prin vederi.

Când ai nevoie atât de chei, cât și de valori, nu parcurge keySet() apelând get pentru fiecare cheie: entrySet() sau forEach sunt mai directe.

Ce returnează

O vedere Set<K> sau Collection<V>.

Exemple

Exemplul 1: Elevii și suma notelor

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> note = new TreeMap<>(Map.of("Radu", 8, "Ana", 10, "Elena", 9));
        System.out.println("Elevi: " + note.keySet());
        System.out.println("Note: " + note.values());
        int suma = 0;
        for (int n : note.values()) {
            suma += n;
        }
        System.out.println("Media: " + (double) suma / note.size());
    }
}

Rezultat

Elevi: [Ana, Elena, Radu]
Note: [10, 9, 8]
Media: 9.0

Exemplul 2: Ștergere prin vedere

retainAll pe keySet() păstrează în map doar elevii din lista prezenților.

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> note = new TreeMap<>(Map.of("Radu", 8, "Ana", 10, "Elena", 9, "Mihai", 6));
        note.keySet().retainAll(List.of("Ana", "Mihai"));
        System.out.println(note);
        note.values().remove(6);
        System.out.println(note);
    }
}

Rezultat

{Ana=10, Mihai=6}
{Ana=10}

Greșeli frecvente

  • Încerci map.keySet().add("x"). Vederile nu permit adăugarea; apare UnsupportedOperationException.
  • Crezi că values() nu are duplicate. Este o Collection, nu un Set; valorile egale apar de mai multe ori.

Comenzi înrudite

  • Map.entrySet: entrySet() dă perechile cheie-valoare ale unui map, ca obiecte Map.Entry; Map.entry(k, v) creează o astfel de pereche.
  • Map.forEach: Parcurge toate perechile unui map și apelează o funcție cu cheia și valoarea fiecăreia: map.forEach((k, v) -> …).
  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.
  • Collection: Interfața de bază pentru liste, mulțimi și cozi: metodele comune add, remove, contains, size și parcurgerea cu for-each.
  • Map.remove: Șterge perechea cu cheia dată și returnează valoarea ei (sau null). Varianta cu două argumente șterge doar dacă valoarea se potrivește.