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