Używanie par w Javie

1. Przegląd

W tym krótkim artykule omówimy bardzo przydatną koncepcję programowania znaną jako para . Pary zapewniają wygodny sposób obsługi prostego skojarzenia klucza z wartością i są szczególnie przydatne, gdy chcemy zwrócić dwie wartości z metody.

Prosta implementacja pary jest dostępna w podstawowych bibliotekach Java. Poza tym niektóre biblioteki zewnętrzne, takie jak Apache Commons i Vavr, ujawniły tę funkcjonalność w swoich odpowiednich interfejsach API.

2. Implementacja Core Java

2.1. Pair Class

Pair klasy można znaleźć w javafx.util opakowaniu. Konstruktor tej klasy przyjmuje dwa argumenty, klucz i odpowiadającą mu wartość:

Pair pair = new Pair(1, "One"); Integer key = pair.getKey(); String value = pair.getValue(); 

Ten przykład ilustruje proste mapowanie liczby całkowitej na ciąg przy użyciu koncepcji pary.

Jak pokazano, klucz w obiekcie pair jest pobierany przez wywołanie metody getKey () , podczas gdy wartość jest pobierana przez wywołanie metody getValue ().

2.2. AbstractMap.SimpleEntry i AbstractMap.SimpleImmutableEntry

SimpleEntry jest zdefiniowana jako klasa zagnieżdżona w klasie AbstractMap . Aby stworzyć obiekt tego typu, możemy podać konstruktorowi klucz i wartość:

AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry(1, "one"); Integer key = entry.getKey(); String value = entry.getValue();

Dostęp do klucza i wartości można uzyskać za pomocą standardowych metod pobierających i ustawiających.

Ponadto klasa AbstractMap zawiera również klasę zagnieżdżoną, która reprezentuje niezmienną parę: klasę SimpleImmutableEntry :

AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");

Działa to w podobny sposób jak zmienna klasa pary, z tym że wartości pary nie można zmienić. Próba wykonania tego spowoduje wyjątek UnsupportedOperationException .

3. Apache Commons

W bibliotece Apache Commons możemy znaleźć klasę Pair w pakiecie org.apache.commons.lang3.tuple . Jest to klasa abstrakcyjna, więc nie można jej bezpośrednio utworzyć.

Znajdziemy tutaj dwie podklasy - reprezentujące niezmienne i zmienne pary: Imm utablePair i MutablePair.

Obie implementacje mają dostęp do metod pobierających / ustawiających klucz / wartość:

ImmutablePair pair = new ImmutablePair(2, "Two"); Integer key = pair.getKey(); String value = pair.getValue();

Nic więc dziwnego, próbą wywołania setValue () na ImmutablePair wyników w UnsupportedOperationException.

Ale operacja jest całkowicie poprawna dla mutowalnej implementacji:

Pair pair = new MutablePair(3, "Three"); pair.setValue("New Three"); 

4. Vavr

W bibliotece Vavr funkcjonalność pary jest zapewniana przez niezmienną klasę Tuple2 :

Tuple2 pair = new Tuple2(4, "Four"); Integer key = pair._1(); String value = pair._2(); 

W tej implementacji nie możemy modyfikować obiektu po utworzeniu, więc metody mutujące zwracają nową instancję, która zawiera podaną zmianę:

tuplePair = pair.update2("New Four"); 

5. Alternatywa I - prosta klasa kontenera

Albo według preferencji użytkownika, albo w przypadku braku żadnej z wyżej wymienionych bibliotek, standardowym obejściem funkcji pary jest utworzenie prostej klasy kontenera, która opakowuje żądane wartości zwracane.

Największą zaletą jest tutaj możliwość podania naszej nazwy, co pomaga uniknąć posiadania tej samej klasy reprezentującej różne obiekty domeny:

public class CustomPair { private String key; private String value; // standard getters and setters }

6. Alternatywa II - tablice

Innym częstym obejściem jest użycie prostej tablicy z dwoma elementami w celu uzyskania podobnych wyników:

private Object[] getPair() { // ... return new Object[] {key, value}; }

Zazwyczaj klucz znajduje się w indeksie zerowym tablicy, podczas gdy odpowiadająca mu wartość znajduje się w indeksie pierwszym.

7. Wnioski

W tym samouczku omówiliśmy koncepcję par w Javie i różne implementacje dostępne w podstawowej Javie, a także w innych bibliotekach innych firm.

Jak zawsze, kod stanowiący kopię zapasową tego samouczka można znaleźć w serwisie GitHub.