Java: cómo crear una nueva entrada (clave, valor)

Resuelto Spiderman asked hace 14 años • 11 respuestas

Me gustaría crear un nuevo elemento que, de manera similar, contendrá Util.Map.Entryla estructura key.value

El problema es que no puedo crear una instancia Map.Entryporque es una interfaz.

¿Alguien sabe cómo crear un nuevo objeto clave/valor genérico para Map.Entry?

Spiderman avatar Jun 24 '10 20:06 Spiderman
Aceptado

Hay public static class AbstractMap.SimpleEntry<K,V>. No dejes que la parte del nombre te engañe: de hecho NOAbstract es una clase (pero su nivel superior sí lo es).abstractAbstractMap

El hecho de que sea una staticclase anidada significa que NO necesitas una AbstractMapinstancia adjunta para crear una instancia, por lo que algo como esto se compila bien:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

Como se señaló en otra respuesta, Guava también tiene un staticmétodo de fábrica conveniente Maps.immutableEntryque puedes usar.


Usted dijo:

No puedo usarlo Map.Entryporque aparentemente es un objeto de solo lectura del que no puedo crear instancias.instanceof

Eso no es del todo exacto. La razón por la que no puedes crear una instancia directamente (es decir, con new) es porque es un archivo interface Map.Entry.


Advertencia y consejo

Como se indica en la documentación, AbstractMap.SimpleEntryes @since 1.6, por lo que si está atascado en 5.0, entonces no estará disponible para usted.

Para buscar otra clase conocida implements Map.Entry, de hecho puedes ir directamente al javadoc. De la versión Java 6

Mapa de interfaz.Entrada

Todas las clases de implementación conocidas :

  • AbstractMap.SimpleEntry,AbstractMap.SimpleImmutableEntry

Desafortunadamente, la versión 1.5 no incluye ninguna clase de implementación conocida que pueda usar, por lo que es posible que tenga que implementar la suya propia.

polygenelubricants avatar Jun 24 '2010 13:06 polygenelubricants

A partir de Java 9, existe un nuevo método de utilidad que permite crear una entrada inmutable que es Map#entry(Object, Object).

Aquí hay un ejemplo simple:

Entry<String, String> entry = Map.entry("foo", "bar");

Como es inmutable, la llamada setValuearrojará un archivo UnsupportedOperationException. Las otras limitaciones son el hecho de que no es serializable y nullcomo la clave o el valor están prohibidos, si no es aceptable para usted, deberá utilizar AbstractMap.SimpleImmutableEntryo AbstractMap.SimpleEntryen su lugar.

NB: Si necesita crear directamente un Mapcon 0 a 10 pares (clave, valor), puede utilizar los métodos de tipo Map.of(K key1, V value1, ...).

Nicolas Filotto avatar Sep 20 '2018 13:09 Nicolas Filotto

Puedes implementar la Map.Entry<K, V>interfaz tú mismo:

import java.util.Map;

final class MyEntry<K, V> implements Map.Entry<K, V> {
    private final K key;
    private V value;

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

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

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

Y luego úsalo:

Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Jesper avatar Jun 24 '2010 14:06 Jesper

Pruebe Maps.immutableEntry de Guava

Esto tiene la ventaja de ser compatible con Java 5 (a diferencia AbstractMap.SimpleEntrydel que requiere Java 6).

finnw avatar Jun 24 '2010 13:06 finnw