Использование пар в Java

Использование пар в Java

1. обзор

В этой быстрой статье мы обсудим очень полезную концепцию программирования, известную какPair. Pairs предоставляют удобный способ обработки простой ассоциации «ключ-значение» и особенно полезны, когда мы хотим вернуть два значения из метода.

Простая реализацияPair доступна в основных библиотеках Java. Кроме того, некоторые сторонние библиотеки, такие как Apache Commons и Vavr, представили эту функциональность в своих соответствующих API.

Дальнейшее чтение:

Java HashMap под капотом

Краткое практическое руководство по внутреннему устройству Hashmap

Read more

Итерировать по карте в Java

Изучите различные способы итерации записей Map в Java.

Read more

Java - объединение нескольких коллекций

Краткое и практическое руководство по объединению нескольких коллекций в Java

Read more

2. Базовая реализация Java

2.1. КлассPair

КлассPair можно найти в пакетеjavafx.util. Конструктор этого класса принимает два аргумента, ключ и соответствующее ему значение:

Pair pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();

Этот пример иллюстрирует простое отображениеInteger вString с использованием концепции пар.

Как показано, ключ в объектеpair извлекается путем вызова методаgetKey(), а значение извлекается путем вызоваgetValue().

2.2. AbstractMap.SimpleEntry иAbstractMap.SimpleImmutableEntry

SimpleEntry определяется как вложенный класс внутри классаAbstractMap. Чтобы создать объект этого типа, мы можем предоставить ключ и значение конструктору:

AbstractMap.SimpleEntry entry
  = new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();

К ключу и значению можно получить доступ через стандартные методы получения и установки.

Кроме того, классAbstractMap также содержит вложенный класс, который представляет неизменяемую пару: классSimpleImmutableEntry:

AbstractMap.SimpleImmutableEntry entry
  = new AbstractMap.SimpleImmutableEntry<>(1, "one");

Это работает подобно классу изменяемой пары, за исключением того, что значение пары не может быть изменено. Попытка сделать это приведет кUnsupportedOperationException.

3. Apache Commons

В библиотеке Apache Commons мы можем найти классPair в пакетеorg.apache.commons.lang3.tuple. Это абстрактный класс, поэтому его нельзя создать напрямую.

Здесь мы можем найти два подкласса, представляющие неизменяемые и изменяемые пары:ImmutablePair иMutablePair.

Обе реализации имеют доступ к методам получения / установки ключа / значения:

ImmutablePair pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();

Неудивительно, что попытка вызватьsetValue() наImmutablePair приводит кUnsupportedOperationException.

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

Pair pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");

4. Vavr

В библиотеке Vavr функциональность пары обеспечивается неизменяемым классомTuple2:

Tuple2 pair = new Tuple2<>(4, "Four");
Integer key = pair._1();
String value = pair._2();

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

tuplePair = pair.update2("New Four");

5. Альтернатива I - класс простого контейнера

Либо по предпочтению пользователя, либо в отсутствие какой-либо из вышеупомянутых библиотек стандартным обходным решением для парной функциональности является создание простого класса-контейнера, который упаковывает желаемые возвращаемые значения.

Самым большим преимуществом здесь является возможность предоставить наше имя, которое помогает избежать того, чтобы один и тот же класс представлял разные доменные объекты:

public class CustomPair {
    private String key;
    private String value;

    // standard getters and setters
}

6. Альтернатива II - Массивы

Другой распространенный обходной путь - использование простого массива с двумя элементами для достижения похожих результатов:

private Object[] getPair() {
    // ...
    return new Object[] {key, value};
}

Как правило, ключ находится в нулевом индексе массива, а его соответствующее значение - в первом индексе.

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

В этом руководстве мы обсудили концепциюPairs в Java и различные реализации, доступные в ядре Java, а также в других сторонних библиотеках.

Как всегда, вы можете найти код, поддерживающий это руководствоon Github.