Ответ
Map не реализует Iterable, потому что не существует однозначного ответа на вопрос "что итерировать?". Map содержит три логически различных набора данных: ключи, значения и пары (записи).
Для итерации используются явные методы:
Set<K> keySet()— итерация по ключам.Collection<V> values()— итерация по значениям.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. Явные методы дают разработчику полный контроль и ясность.