Рубрики
Без рубрики

Использование Java-класса Map.Entry

Автор оригинала: baeldung.

1. Обзор

Мы часто используем карты для хранения коллекции пар ключ-значение. Затем, в какой-то момент, нам часто приходится перебирать их .

В этом уроке мы сравним различные методы итерации карт, выделив, когда может быть полезно использовать Map.Entry . Затем мы узнаем, как Map.Entry можно использовать для создания кортежа. Наконец, мы создадим упорядоченный список кортежей.

2. Оптимизация итерации Карты

Предположим, что у нас есть карта названий книг с именем автора в качестве ключа:

Map map = new HashMap<>();

map.put("Robert C. Martin", "Clean Code");
map.put("Joshua Bloch", "Effective Java");

Давайте сравним два метода получения всех ключей и значений с нашей карты.

2.1. Использование Map.keySet

Во-первых, рассмотрим следующее:

for (String key : bookMap.keySet()) {
    System.out.println("key: " + key + " value: " + bookMap.get(key));
}

Здесь цикл повторяет набор ключей . Для каждого ключа мы получаем соответствующее значение, используя Map.get . Хотя это очевидный способ использовать все записи на карте, для каждой записи требуется две операции: одна для получения следующего ключа и одна для поиска значения с помощью get .

Если нам нужны только ключи на карте, keySet – хороший вариант. Однако есть более быстрый способ получить как ключи, так и значения.

2.2. Использование Map.entrySet Вместо

Давайте перепишем нашу итерацию, чтобы использовать entrySet :

for (Map.Entry book: bookMap.entrySet()) {
    System.out.println("key: " + book.getKey() + " value: " + book.getValue());
}

В этом примере наш цикл выполняется над коллекцией объектов Map.Entry . Поскольку Map.Entry хранит ключ и значение вместе в одном классе, мы получаем их оба в одной операции .

Те же правила применяются к с использованием потоковых операций Java 8 . Потоковая передача по entrySet и работа с Entry объектами более эффективна и может потребовать меньше кода.

3. Работа С Кортежами

Кортеж-это структура данных с фиксированным числом и порядком элементов. Мы можем думать о Map.Entry – это кортеж, в котором хранятся два элемента-ключ и значение. Однако, поскольку Map.Entry является интерфейсом, нам требуется класс реализации. В этом разделе мы рассмотрим одну реализацию, предоставленную JDK: AbstractMap.SimpleEntry .

3.1. Создание кортежа

Во-первых, рассмотрим класс Book :

public class Book {
    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }
    ...

Далее давайте создадим кортеж Map.Entry с ISBN в качестве ключа и объектом Book в качестве значения:

Map.Entry tuple;

Наконец, давайте создадим экземпляр нашего кортежа с помощью AbstractMap.SimpleEntry :

tuple = new AbstractMap.SimpleEntry<>("9780134685991", new Book("Effective Java 3d Edition", "Joshua Bloch"));

3.2. Создание упорядоченного списка кортежей

При работе с кортежами часто полезно иметь их в виде упорядоченного списка.

Сначала мы определим наш список кортежей:

List> orderedTuples = new ArrayList<>();

Во-вторых, давайте добавим несколько записей в наш список:

orderedTuples.add(new AbstractMap.SimpleEntry<>("9780134685991", 
  new Book("Effective Java 3d Edition", "Joshua Bloch")));
orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884", 
  new Book("Clean Code","Robert C Martin")));

3.3. Сравнение С Картой

Чтобы сравнить различия с Map , давайте добавим новую запись с ключом, который уже существует:

orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884", 
  new Book("Clean Code", "Robert C Martin")));

Во-вторых, мы пройдемся по нашему списку, отобразив все ключи и значения:

for (Map.Entry tuple : orderedTuples) {
    System.out.println("key: " + tuple.getKey() + " value: " + tuple.getValue());
}

Наконец, давайте посмотрим на результат:

key: 9780134685991 value: Book{title='Effective Java 3d Edition', author='Joshua Bloch'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}

Обратите внимание, что у нас могут быть дубликаты ключей , в отличие от базовой Карты , где каждый ключ должен быть уникальным. Это связано с тем, что мы использовали реализацию List для хранения наших объектов Simple Entry , что означает, что все объекты независимы друг от друга.

3.4. Списки объектов ввода

Следует отметить, что цель Entry не состоит в том, чтобы действовать как общий кортеж. Библиотечные классы часто предоставляют общую пару класс для этой цели.

Однако мы можем обнаружить, что нам необходимо временно работать со списками записей при подготовке данных для Карты или извлечении данных из одного из них.

4. Заключение

В этой статье мы рассмотрели Map.entrySet как альтернативу перебору ключей карты.

Затем мы рассмотрели, как Map.Entry можно использовать в качестве кортежа.

Наконец, мы создали список упорядоченных кортежей, сравнив различия с базовой Картой .

Как всегда, пример кода доступен на GitHub .