Un KeyValuePair en Java [duplicate]

5 minutos de lectura

Estoy buscando una clase KeyValuePair en Java.
Dado que java.util usa mucho las interfaces, no se proporciona una implementación concreta, solo la interfaz Map.Entry.

¿Hay alguna implementación canónica que pueda importar? Es una de esas clases de “programación de fontaneros” que odio implementar 100 veces.

  • Recomiendo no usar una clase KeyValuePair genérica. Es mucho mejor definir una clase específica de dominio con accesores más informativos (por ejemplo, getProductId(), getProductPrice()).

    – Adamski

    4 de junio de 2010 a las 10:04

  • @Adamski: No estoy de acuerdo. No utilizamos dominios específicos Map o List clases, ¿por qué esto debería ser diferente? Un KeyValuePair es solo un mapa con una entrada.

    – Skaffman

    4 de junio de 2010 a las 10:21

  • @skaffman: punto justo, pero creo que el concepto de un par genérico es más fácil de abusar que pasar las colecciones. Por ejemplo, si alguien quiere devolver dos valores de un método, es tentador devolver un Par, pero normalmente esto es indicativo de un problema de diseño subyacente (p. ej., ¿Por qué X e Y no están unificados de alguna manera en el modelo de dominio? si están intrínsecamente relacionados?)

    – Adamski

    4 de junio de 2010 a las 10:31

  • @Adamski: Porque no lo es <X,Y>su <Key,Value>. Él no está pidiendo una arbitraria Pair tipo, está pidiendo un KeyValuePair escribe.

    – Skaffman

    4 de junio de 2010 a las 10:38

  • A pesar de esto, preferiría pasar una sola instancia de objeto en mi código, potencialmente con un método getKey() definido; por ejemplo, prefiero: procesarProducto(Producto) a procesarProducto(KeyValuePair) donde Integer es el ID del producto. Estoy de acuerdo en que KeyValuePair (es decir, Map.Entry) o incluso un par genérico es útil dentro de la lógica de un método, pero no me gusta que se “filtre” como un tipo de devolución o que se proporcione como un parámetro de método; por ejemplo, nunca paso Map.Entry.

    – Adamski

    4 de junio de 2010 a las 10:52


avatar de usuario
Eyal Schneider

La clase AbstractMap.SimpleEntry es genérico y puede ser útil.

  • …o AbstractMap.SimpleImmutableEntry si corresponde.

    – karmakaze

    7 de agosto de 2013 a las 3:09

  • Así que debería usar List<AbstractMap.SimpleEntry> ¿correcto?

    – Jorge

    18 mayo 2016 a las 22:15

  • Mejor use AbstractMap.SimpleEntry / AbstractMap.SimpleImmutableEntry como base para su propia clase específica de dominio, para ser OO. En el caso más simple, se trata simplemente de dar un nuevo nombre a la clase ya los dos elementos.

    – Foo

    29 de junio de 2017 a las 17:48


  • En interés de las mejores prácticas, cabe señalar que en la mayoría de los casos java.util.Map.Entry<K, V> debe usarse para programar interfaces. Entonces deberías estar usando List<Map.Entry<K, V>>por ejemplo, por la misma razón por la que no usaría ArrayList<AbstractMap.SimpleEntry<K,V>> en el código de consumo. El código que en realidad crea la instancia debe usar una clase concreta, obviamente.

    – Garret Wilson

    31 de marzo de 2019 a las 16:31


avatar de usuario
kreker

Los programadores de Android podrían usar Par de valor de nombre básico

Actualizar:

Par de valor de nombre básico ahora está en desuso (API 22). Usar Par en cambio.

Ejemplo de uso:

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

  • Eso no es solo para programadores de Android, es cualquier programa de Java.

    – Cody

    13 de diciembre de 2011 a las 12:45

  • @doctor-oreo sí, cualquier programador de Java podría descargar jar de hc.apache.org pero android tiene esos incorporado

    – kreker

    13 de diciembre de 2011 a las 21:58


  • En realidad, para los usuarios de Android, una buena opción es android.util.Pair.

    – chhabrakadabra

    4 de abril de 2012 a las 1:43

  • @ GalDude33 ¿por qué es eso? Se agrega en el nivel 5 api.

    – kreker

    16 de julio de 2014 a las 0:05

  • Esta no es una función de lenguaje disponible universalmente y requerirá más que un tiempo de ejecución estándar de JRE. Pair proviene de javafx.util, que introduce una dependencia de JavaFX, como OracleJDK, OpenJDK u OpenJFX. Si está utilizando uno de estos tiempos de ejecución de Java, entonces genial, pero no hay una forma trivial de agregar esto a una instalación de JRE con una dependencia de Maven o Gradle.

    – Brandón

    12 de junio de 2017 a las 21:22


avatar de usuario
remípoda

La clase Pair de Commons Lang podría ayudar:

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

Por supuesto, necesitaría incluir commons-lang.

  • url cambia de vez en cuando. Busqué en Google Pair Commons Lang” y lo encontré. Eliminé el enlace para evitar más votos negativos 🙁

    – remípoda

    01/04/2013 a las 17:52

  • Desde 1.6 ha habido java.util.AbstractMap.SimpleEntry – lo que hace que el par común sea redundante.

    – André

    5 de agosto de 2016 a las 21:16

  • Personalmente, prefiero Commons Pair: no parece correcto tener que buscar una clase dentro de AbstractMap. Pero si no quieres depender de commons lang por alguna razón, podría verlo.

    – metaforja

    23/09/2016 a las 20:41

avatar de usuario
aaroncarsonart

Uso de javafx.util.Pair es suficiente para la mayoría de los pares clave-valor simples de dos tipos que se pueden instanciar.

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

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;
    }
}

avatar de usuario
Nathan Clark Baumgartner

me gusta usar

Propiedades

Ejemplo:

Properties props = new Properties();

props.setProperty("displayName", "Jim Wilson"); // (key, value)

String name = props.getProperty("displayName"); // => Jim Wilson

String acctNum = props.getProperty("accountNumber"); // => null

String nextPosition = props.getProperty("position", "1"); // => 1

Si está familiarizado con una tabla hash, ya estará bastante familiarizado con esto.

avatar de usuario
Mohamed Nabil

Puede crear su clase KeyValuePair personalizada fácilmente

public class Key<K, V>{

    K key;
    V value;

    public Key() {

    }

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

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

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

}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad