Използване на двойки в Java

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.