Статья

Как в Java перебрать все элементы Map?

В этом кратком руководстве мы рассмотрим различные способы перебора элементов Map в Java.

Мы можем извлечь содержимое Map с помощью методов entrySet(), keySet() или values(). Поскольку все это сеты, ко всем из них применимы аналогичные принципы итерации.

Давайте подробнее рассмотрим некоторые из них.

Краткое введение в методы entrySet(), keySet() и values()

Прежде чем мы пройдемся по Map, используя эти три метода, давайте разберемся, что они делают:
  • entrySet() – возвращает представление коллекции Map, элементы которой принадлежат классу Map.Entry. Метод entry.getKey() возвращает ключ, а метод entry.GetValue() возвращает соответствующее значение
  • keySet() – возвращает все ключи, содержащиеся в Map, в виде множества
  • values() – возвращает все значения, содержащиеся в Map, в виде множества
Далее, давайте посмотрим на эти методы в действии.

Использование цикла for

Метод entrySet()

Сначала давайте посмотрим, как выполнить итерацию по Map с помощью entrySet:
public void iterateWithEntrySet(Map<String, Integer> map) {
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}
Здесь мы извлекаем набор записей из нашего Map, а затем перебираем их, используя классический подход "for each".

Метод keySet()

В качестве альтернативы, мы можем сначала получить все ключи из нашего Map, используя метод keySet, а затем выполнить итерацию по каждому ключу:
public void iterateWithKeySetAndForeach(Map<String, Integer> map) {
    for (String key : map.keySet()) {
        System.out.println(key + ":" + map.get(key));
    }
}

Перебор значений с помощью values()

public void iterate(Map<String, Integer> map) {
    for (Integer value : map.values()) {
        System.out.println(value);
    }
}

Итератор

Другим подходом к выполнению итерации является использование итератора. Далее давайте посмотрим, как методы работают с объектом Iterator.

Итератор и entrySet()

Сначала давайте выполним итерацию по карте, используя итератор и entrySet():
public void iterateWithIteratorAndEntry(Map<String, Integer> map) {
    Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Integer> entry = iterator.next();
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}
Обратите внимание, как мы можем получить экземпляр Iterator, используя iterator() API в Set, возвращаемого entrySet(). Затем, как обычно, мы перебираем итератор с помощью iterator.next().

Iterator и keySet()

Аналогично, мы можем выполнить итерацию по Map, используя итератор и keySet():
public void iterateWithIteratorAndKeySet(Map<String, Integer> map) {
    Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        String key = iterator.next();
        System.out.println(key + ":" + map.get(key));
    }
}

Iterator и values()

Мы также можем просмотреть значения Map, используя итератор и метод values():
public void iterateWithIteratorAndValues(Map<String, Integer> map) {
    Iterator<Integer> iterator = map.values().iterator();
    while (iterator.hasNext()) {
        Integer value = iterator.next();
        System.out.println("value :" + value);
    }
}

Использование лямбд и Stream API

Начиная с версии Java 8 появился Stream API и лямбда-выражения. Далее давайте посмотрим, как выполнить итерацию Map, используя эти методы.

Использование forEach() и лямбд

public void iterateWithLambda(Map<String, Integer> map) {
    map.forEach((k, v) -> System.out.println((k + ":" + v)));
}
В этом случае нам не нужно преобразовывать Map в множество записей.

Используем ключи для итерации по Map:
public void iterateByKeysWithLambda(Map<String, Integer> map) {
    map.keySet().foreach(k -> System.out.println((k + ":" + map.get(k))));
}
Аналогично, мы можем использовать ту же технику с методом values():
public void iterateValuesWithLambda(Map<String, Integer> map) {
    map.values().forEach(v -> System.out.println(("value: " + v)));
}

Использование Stream API

Stream API - одна из важных функций Java 8. Мы также можем использовать эту функциональность для циклического обхода Map.

Stream API следует использовать, когда мы планируем выполнить некоторую дополнительную потоковую обработку.

Давайте возьмем entrySet() в качестве примера, чтобы увидеть, как работает Stream API
public void iterateWithtreamAPI(Map<String, Integer> map) {
    map.entrySet().stream()
      // ... здесь какая-то другая потоковая обработка
      .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
}
Использование Stream API с методами keySet() и values() будет очень похоже на приведенный выше пример.
java