Почему Map в Java не реализует интерфейс Iterable?

«Почему Map в Java не реализует интерфейс Iterable?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Map не реализует Iterable, потому что не существует однозначного ответа на вопрос "что итерировать?". Map содержит три логически различных набора данных: ключи, значения и пары (записи).

Для итерации используются явные методы:

  1. Set<K> keySet() — итерация по ключам.
  2. Collection<V> values() — итерация по значениям.
  3. Set<Map.Entry<K, V>> entrySet() — итерация по парам ключ-значение (наиболее частый случай).

Примеры:

Map<String, Integer> scores = Map.of("Alice", 95, "Bob", 87);

// 1. Итерация по записям (рекомендуется)
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
    System.out.printf("%s: %dn", entry.getKey(), entry.getValue());
}

// 2. Итерация по ключам
for (String name : scores.keySet()) {
    System.out.println(name);
}

// 3. Итерация по значениям
for (Integer score : scores.values()) {
    System.out.println(score);
}

// 4. С использованием Stream API
scores.entrySet().stream()
       .filter(entry -> entry.getValue() > 90)
       .forEach(System.out::println);

Если бы Map был Iterable, пришлось бы выбирать один вариант по умолчанию (например, entrySet), что скрывало бы другие возможности и усложняло API. Явные методы дают разработчику полный контроль и ясность.