Java 9 ou superior
No Java 9, você pode simplesmente escrever: Map.entry(key, value)
para criar um par imutável.
Nota: este método não permite que chaves ou valores sejam nulos. Se você quiser permitir valores nulos, por exemplo, que você gostaria de mudar isso para: Map.entry(key, Optional.ofNullable(value))
.
Java 8+
No Java 8, você pode usar o propósito mais geral javafx.util.Pair
para criar um par serializável e imutável. Esta classe não permitir chaves nulos e valores nulos. (No Java 9, essa classe está incluída no javafx.base
módulo). EDIT: A partir do Java 11, o JavaFX foi dissociado do JDK, portanto, você precisa do artefato maven adicional org.openjfx: javafx-base.
Java 6+
No Java 6 e superior, você pode usar o mais detalhado AbstractMap.SimpleImmutableEntry
para um par imutável ou AbstractMap.SimpleEntry
para um par cujo valor pode ser alterado. Essas classes também permitem chaves e valores nulos e são serializáveis.
Android
Se você está escrevendo para Android, use Pair.create(key, value)
para criar um par imutável.
Apache Commons
Apache Commons Lang
fornece o útil Pair.of(key, value)
para criar um par imutável, comparável e serializável.
Coleções Eclipse
Se você estiver usando pares que contêm primitivas, o Eclipse Collections fornecerá algumas classes de pares primitivos muito eficientes que evitarão todo o ineficiente auto-boxe e auto-unboxing.
Por exemplo, você pode usar PrimitiveTuples.pair(int, int)
para criar um IntIntPair
ou PrimitiveTuples.pair(float, long)
para criar um FloatLongPair
.
Projeto Lombok
Usando o Projeto Lombok , você pode criar uma classe de pares imutável simplesmente escrevendo:
@Value
public class Pair<K, V> {
K key;
V value;
}
Lombok vai encher No construtor, getters, equals()
, hashCode()
, e toString()
métodos para você automaticamente no bytecode gerado. Se você quer um método de fábrica estático em vez de um construtor, por exemplo, um Pair.of(k, v)
, basta alterar a anotação para: @Value(staticConstructor = "of")
.
De outra forma
Se nenhuma das soluções acima flutuar no seu barco, você pode simplesmente copiar e colar o código a seguir (que, diferentemente da classe listada na resposta aceita, 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;
}
}