Java: cómo crear una nueva entrada (clave, valor)
Me gustaría crear un nuevo elemento que, de manera similar, contendrá Util.Map.Entry
la estructura key
.value
El problema es que no puedo crear una instancia Map.Entry
porque es una interfaz.
¿Alguien sabe cómo crear un nuevo objeto clave/valor genérico para Map.Entry?
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).abstract
AbstractMap
El hecho de que sea una static
clase anidada significa que NO necesitas una AbstractMap
instancia 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 static
método de fábrica conveniente Maps.immutableEntry
que puedes usar.
Usted dijo:
No puedo usarlo
Map.Entry
porque 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.SimpleEntry
es @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.
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 setValue
arrojará un archivo UnsupportedOperationException
. Las otras limitaciones son el hecho de que no es serializable y null
como la clave o el valor están prohibidos, si no es aceptable para usted, deberá utilizar AbstractMap.SimpleImmutableEntry
o AbstractMap.SimpleEntry
en su lugar.
NB: Si necesita crear directamente un Map
con 0 a 10 pares (clave, valor), puede utilizar los métodos de tipo Map.of(K key1, V value1, ...)
.
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());
Pruebe Maps.immutableEntry de Guava
Esto tiene la ventaja de ser compatible con Java 5 (a diferencia AbstractMap.SimpleEntry
del que requiere Java 6).