1. Обзор
В этом кратком руководстве мы обсудим очень полезную концепцию программирования, известную как Pair
. Пары
обеспечивают удобный способ обработки простого сопоставления ключа со значением и особенно полезны, когда мы хотим вернуть два значения из метода.
Простая реализация Pair
доступна в основных библиотеках Java. Кроме того, некоторые сторонние библиотеки, такие как Apache Commons и Vavr, предоставили эту функциональность в своих соответствующих API.
2. Основная реализация Java
2.1. Парный
класс _
Мы можем найти класс Pair в пакете
javafx.util
. Конструктор этого класса принимает два аргумента: ключ и соответствующее ему значение:
Pair<Integer, String> 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<Integer, String> entry
= new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();
Доступ к ключу и значению можно получить с помощью стандартных методов получения и установки.
Кроме того, класс AbstractMap
также содержит вложенный класс, представляющий неизменяемую пару, класс SimpleImmutableEntry
:
AbstractMap.SimpleImmutableEntry<Integer, String> entry
= new AbstractMap.SimpleImmutableEntry<>(1, "one");
Это работает аналогично классу изменяемой пары, за исключением того, что значение пары нельзя изменить. Попытка сделать это приведет к UnsupportedOperationException
.
3. Апач Коммонс
В библиотеке Apache Commons мы можем найти класс Pair
в пакете org.apache.commons.lang3.tuple .
Это абстрактный класс, поэтому его нельзя создать напрямую.
Здесь мы можем найти два подкласса, представляющих неизменяемые и изменяемые пары, Imm
utablePair
и MutablePair.
Обе реализации имеют доступ к методам получения/установки ключей/значений:
ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();
Неудивительно, что попытка вызвать setValue()
для ImmutablePair
приводит к исключению UnsupportedOperationException.
Однако операция полностью действительна для изменяемой реализации:
Pair<Integer, String> pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");
4. Вавр
В библиотеке Vavr парная функциональность обеспечивается неизменяемым классом Tuple2
:
Tuple2<Integer, String> 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 .