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

1. Обзор

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

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

2. Реализация ядра Java

2.1. Пара Класс

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

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

Этот пример иллюстрирует простой Integer для строки отображения с использованием концепции 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 . Это абстрактный класс, поэтому его нельзя создать напрямую.

Здесь мы можем найти два подкласса, представляющие неизменяемые и изменяемые пары: Imm utablePair и 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 парная функциональность обеспечивается неизменным классом 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. Заключение

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

Как всегда, вы можете найти код этого руководства на GitHub.