1. Общ преглед
В тази кратка статия ние обсъждаме изключително полезната концепция за програмиране, известна като Pair . Двойките осигуряват удобен начин за работа с прост асоцииране на ключ към стойност и са особено полезни, когато искаме да върнем две стойности от метод.
Една проста реализация на Pair е достъпна в основните Java библиотеки. Освен това някои библиотеки на трети страни като Apache Commons и Vavr са изложили тази функционалност в съответните си API.
2. Основна реализация на Java
2.1. Най- Pair клас
Класът Pair може да бъде намерен в пакета javafx.util . Конструкторът на този клас взема два аргумента, ключ и съответната му стойност:
Pair pair = new Pair(1, "One"); Integer key = pair.getKey(); String value = pair.getValue();
Този пример илюстрира просто преобразуване на Integer to 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 . Това е абстрактен клас, така че не може да бъде директно създаден екземпляр.
Тук можем да намерим два подкласа - представляващи неизменяеми и изменяеми двойки: Imm utablePair и MutablePair.
И двете изпълнения имат достъп до методите ключ / стойност getter / setter:
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.