259 votes

Une paire clé-valeur en Java

Je suis à la recherche d'une classe KeyValuePair en Java.
Comme java.util utilise beaucoup les interfaces, aucune implémentation concrète n'est fournie, seulement l'interface Map.Entry.

Existe-t-il une implémentation canonique que je peux importer ? C'est l'une de ces classes de "programmation pour plombiers" que je déteste implémenter 100 fois.

4 votes

Je vous déconseille d'utiliser une classe KeyValuePair générique. Il vaut mieux définir une classe spécifique au domaine avec des accesseurs plus informatifs (par exemple, getProductId(), getProductPrice()).

25 votes

@Adamski : Je ne suis pas d'accord. Nous n'utilisons pas d'outils spécifiques au domaine Map o List classes, pourquoi cela devrait-il être différent ? Une KeyValuePair est simplement une Map avec une entrée.

4 votes

@skaffman : Bon point, mais je pense que le concept d'un Pair générique est plus facilement ouvert à l'abus que de passer des Collections autour. Par exemple, si quelqu'un veut renvoyer deux valeurs à partir d'une méthode, il est tentant de renvoyer une Paire<X,Y> mais cela indique généralement un problème de conception sous-jacent (par exemple, pourquoi X et Y ne sont pas unifiés d'une manière ou d'une autre dans le modèle de domaine s'ils sont intrinsèquement liés ?)

275voto

Eyal Schneider Points 11399

La classe AbstractMap.SimpleEntry est générique et peut être utile.

12 votes

...ou AbstractMap.SimpleImmutableEntry le cas échéant.

0 votes

Je devrais donc utiliser List<AbstractMap.SimpleEntry> correct ?

2 votes

Il est préférable d'utiliser AbstractMap.SimpleEntry / AbstractMap.SimpleImmutableEntry comme base pour votre propre classe, spécifique au domaine, pour être OO. Dans le cas le plus simple, il suffit de donner un nouveau nom à la classe et aux deux éléments.

112voto

kreker Points 1447

Les programmeurs Android pourraient utiliser BasicNameValuePair

Mise à jour :

BasicNameValuePair est désormais obsolète (API 22). Utilisez Paire à la place.

Exemple d'utilisation :

Pair<Integer, String> simplePair = new Pair<>(42, "Second");
Integer first = simplePair.first; // 42
String second = simplePair.second; // "Second"

12 votes

Ce n'est pas seulement pour les programmeurs Android, c'est pour tout programme java.

4 votes

@doctor-oreo oui n'importe quel programmeur java peut télécharger le jar à partir de hc.apache.org mais Android en a intégré

34 votes

En fait, pour les utilisateurs d'Android, un bon choix est Android.util.Pair .

56voto

remipod Points 1243

La classe Pair de Commons Lang pourrait vous aider :

Pair<String, String> keyValue = new ImmutablePair("key", "value");

Bien sûr, vous devrez inclure commons-lang.

8 votes

L'url change de temps en temps. J'ai tapé "Pair Commons Lang" sur Google et je l'ai trouvé. J'ai retiré le lien pour éviter d'autres votes négatifs :-(

2 votes

Depuis la version 1.6, il y a java.util.AbstractMap.SimpleEntry - ce qui rend la paire commune superflue.

2 votes

Personnellement, je préfère Pair commun - il ne me semble pas normal de devoir chercher une classe à l'intérieur d'AbstractMap. Mais si vous ne voulez pas dépendre de commons lang pour une raison quelconque, je peux le comprendre.

15voto

aaroncarsonart Points 832

Utilisation de javafx.util.Pair est suffisant pour la plupart des paires clé-valeur simples de deux types quelconques qui peuvent être instanciés.

Pair<Integer, String> myPair = new Pair<>(7, "Seven");
Integer key = myPair.getKey();
String value = myPair.getValue();

2 votes

Cette fonction est également disponible dans Android (Support Library).

4 votes

Il n'est pas disponible dans le JDK serveur (headless) ou à partir de Java 1.9.

13voto

Neoheurist Points 927
import java.util.Map;

public class KeyValue<K, V> implements Map.Entry<K, V>
{
    private K key;
    private V value;

    public KeyValue(K key, V value)
    {
        this.key = key;
        this.value = value;
    }

    public K getKey()
    {
        return this.key;
    }

    public V getValue()
    {
        return this.value;
    }

    public K setKey(K key)
    {
        return this.key = key;
    }

    public V setValue(V value)
    {
        return this.value = value;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X