Utilisation de paires en Java

Utilisation de paires en Java

1. Vue d'ensemble

Dans cet article rapide, nous discutons du concept de programmation très utile connu sous le nom dePair. LesPairs fournissent un moyen pratique de gérer une simple association clé à valeur et sont particulièrement utiles lorsque nous voulons renvoyer deux valeurs à partir d'une méthode.

Une implémentation simple d'unPair est disponible dans les bibliothèques Java principales. De plus, certaines bibliothèques tierces telles qu'Apache Commons et Vavr ont exposé cette fonctionnalité dans leurs API respectives.

Lectures complémentaires:

La carte de hachage Java sous le capot

Un guide rapide et pratique des composants internes de Hashmap

Read more

Itérer sur une carte en Java

Apprenez différentes manières de parcourir les entrées d'une carte en Java.

Read more

Java - Combiner plusieurs collections

Un guide rapide et pratique pour combiner plusieurs collections en Java

Read more

2. Implémentation Java de base

2.1. La classePair

La classePair se trouve dans le packagejavafx.util. Le constructeur de cette classe prend deux arguments, une clé et la valeur correspondante:

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

Cet exemple illustre un simple mappage deInteger àString à l'aide du concept Pair.

Comme indiqué, la clé de l'objetpair est récupérée en appelant une méthodegetKey() tandis que la valeur est récupérée en appelantgetValue().

2.2. AbstractMap.SimpleEntry etAbstractMap.SimpleImmutableEntry

SimpleEntry est défini comme une classe imbriquée dans la classeAbstractMap. Pour créer un objet de ce type, nous pouvons fournir une clé et une valeur au constructeur:

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

La clé et la valeur sont accessibles via les méthodes getter et setter standard.

De plus, la classeAbstractMap contient également une classe imbriquée qui représente une paire immuable: la classeSimpleImmutableEntry:

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

Cela fonctionne de la même manière que la classe de paires mutables, sauf que la valeur de la paire ne peut pas être modifiée. Tenter de le faire entraînera unUnsupportedOperationException.

3. Apache Commons

Dans la bibliothèque Apache Commons, nous pouvons trouver la classePair dans le packageorg.apache.commons.lang3.tuple. C'est une classe abstraite, elle ne peut donc pas être instanciée directement.

Nous pouvons trouver ici, deux sous-classes - représentant des paires immuables et mutables:ImmutablePair etMutablePair.

Les deux implémentations ont accès aux méthodes de lecture / définition de clé / valeur:

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

Sans surprise, une tentative d'appel desetValue() sur leImmutablePair entraîne unUnsupportedOperationException.

Mais l'opération est entièrement valide pour une implémentation mutable:

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

4. Vavr

Dans la bibliothèque Vavr, la fonctionnalité de paire est fournie par la classe immuableTuple2:

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

Dans cette implémentation, nous ne pouvons pas modifier l'objet après sa création, donc les méthodes de mutation renvoient une nouvelle instance qui inclut la modification fournie:

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

5. Alternative I - Classe de conteneur simple

Selon les préférences de l'utilisateur ou en l'absence de l'une des bibliothèques susmentionnées, une solution de contournement standard pour la fonctionnalité de paire consiste à créer une classe de conteneur simple qui englobe les valeurs de retour souhaitées.

Le plus gros avantage ici est la possibilité de donner notre nom, ce qui permet d'éviter d'avoir la même classe représentant différents objets de domaine:

public class CustomPair {
    private String key;
    private String value;

    // standard getters and setters
}

6. Alternative II - Tableaux

Une autre solution courante consiste à utiliser un simple tableau avec deux éléments pour obtenir des résultats similaires:

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

En règle générale, la clé est située à l'index zéro du tableau, tandis que la valeur correspondante est située à l'index un.

7. Conclusion

Dans ce tutoriel, nous avons discuté du concept dePairs en Java et des différentes implémentations disponibles dans le noyau Java ainsi que dans d'autres bibliothèques tierces.

Comme toujours, vous pouvez trouver le code qui accompagne ce tutorielon Github.