Использование пар в Java
1. обзор
В этой быстрой статье мы обсудим очень полезную концепцию программирования, известную какPair. Pairs предоставляют удобный способ обработки простой ассоциации «ключ-значение» и особенно полезны, когда мы хотим вернуть два значения из метода.
Простая реализацияPair доступна в основных библиотеках Java. Кроме того, некоторые сторонние библиотеки, такие как Apache Commons и Vavr, представили эту функциональность в своих соответствующих API.
Дальнейшее чтение:
Java HashMap под капотом
Краткое практическое руководство по внутреннему устройству Hashmap
Java - объединение нескольких коллекций
Краткое и практическое руководство по объединению нескольких коллекций в Java
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.