Java 9+
En Java 9, simplemente puede escribir: Map.entry(key, value)
para crear un par inmutable.
Nota: este método no permite que las claves o valores sean nulos. Si desea permitir valores nulos, por ejemplo, que te gustaría cambiar esto a: Map.entry(key, Optional.ofNullable(value))
.
Java 8+
En Java 8, puede usar el propósito más general javafx.util.Pair
para crear un par inmutable y serializable. Esta clase no permite llaves nulos y valores nulos. (En Java 9, esta clase está incluida en el javafx.base
módulo).EDITAR: a partir de Java 11, JavaFX se ha desacoplado del JDK, por lo que necesitará el artefacto maven adicional org.openjfx: javafx-base.
Java 6+
En Java 6 y versiones posteriores, puede usar el más detallado AbstractMap.SimpleImmutableEntry
para un par inmutable o AbstractMap.SimpleEntry
para un par cuyo valor se puede cambiar. Estas clases también permiten claves nulas y valores nulos, y son serializables.
Androide
Si está escribiendo para Android, solo use Pair.create(key, value)
para crear un par inmutable.
Apache Commons
Apache Commons Lang
proporciona la ayuda Pair.of(key, value)
para crear un par inmutable, comparable y serializable.
Colecciones Eclipse
Si usa pares que contienen primitivas, Eclipse Collections proporciona algunas clases de pares primitivos muy eficientes que evitarán todo el ineficiente auto-boxing y auto-unboxing.
Por ejemplo, podría usar PrimitiveTuples.pair(int, int)
para crear un IntIntPair
, o PrimitiveTuples.pair(float, long)
para crear un FloatLongPair
.
Proyecto lombok
Con Project Lombok , puede crear una clase de par inmutable simplemente escribiendo:
@Value
public class Pair<K, V> {
K key;
V value;
}
Lombok llenará en el constructor, captadores, equals()
, hashCode()
, y toString()
métodos de forma automática en el código de bytes generada. Si quieres un método de fábrica estática en lugar de un constructor, por ejemplo, una Pair.of(k, v)
, basta con cambiar la anotación a: @Value(staticConstructor = "of")
.
De otra manera
Si ninguna de las soluciones anteriores flota en su bote, simplemente puede copiar y pegar el siguiente código (que, a diferencia de la clase que figura en la respuesta aceptada, protege contra NullPointerExceptions):
import java.util.Objects;
public class Pair<K, V> {
public final K key;
public final V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public boolean equals(Object o) {
return o instanceof Pair && Objects.equals(key, ((Pair<?,?>)o).key) && Objects.equals(value, ((Pair<?,?>)o).value);
}
public int hashCode() {
return 31 * Objects.hashCode(key) + Objects.hashCode(value);
}
public String toString() {
return key + "=" + value;
}
}