Java 9 +
В Java 9 вы можете просто написать: Map.entry(key, value)
создать неизменную пару.
Примечание: этот метод не допускает, чтобы ключи или значения были нулевыми. Например, если вы хотите разрешить нулевые значения, вы можете изменить это на: Map.entry(key, Optional.ofNullable(value))
.
Java 8 +
В Java 8 вы можете использовать более универсальный javafx.util.Pair
для создания неизменяемой, сериализуемой пары. Этот класс позволяет разрешать нулевые ключи и нулевые значения. (В Java 9 этот класс включен в модуль javafx.base
). РЕДАКТИРОВАТЬ: Начиная с Java 11, JavaFX был отделен от JDK, поэтому вам потребуется дополнительный артефакт maven org.openjfx: javafx-base.
Java 6 +
В Java 6 и выше вы можете использовать более многословный AbstractMap.SimpleImmutableEntry
для неизменной пары или AbstractMap.SimpleEntry
для пары, значение которой можно изменить. Эти классы также допускают нулевые ключи и нулевые значения и являются сериализуемыми.
Android
Если вы пишете для Android, просто используйте Pair.create(key, value)
, чтобы создать неизменную пару.
Apache Commons
Apache Commons Lang
предоставляет полезную информацию Pair.of(key, value)
для создания неизменной, сопоставимой, сериализуемой пары.
Коллекции Затмения
Если вы используете пары, содержащие примитивы, Eclipse Collections предоставляет некоторые очень эффективные классы примитивных пар, которые позволят избежать всех неэффективных автоматических и автоматических распаковок.
Например, вы можете использовать PrimitiveTuples.pair(int, int)
для создания IntIntPair
или PrimitiveTuples.pair(float, long)
для создания FloatLongPair
.
Проект Ломбок
Используя Project Lombok , вы можете создать класс неизменяемой пары просто написав:
@Value
public class Pair<K, V> {
K key;
V value;
}
Lombok автоматически заполнит методы конструктора, геттера, equals()
, hashCode()
и toString()
для вас в сгенерированном байт-коде. Если вам нужен статический метод фабрики вместо конструктора, например, Pair.of(k, v)
, просто измените аннотацию на: @Value(staticConstructor = "of")
.
В противном случае
Если ни одно из вышеперечисленных решений не всплыло на вашей лодке, вы можете просто скопировать и вставить следующий код (который, в отличие от класса, указанного в принятом ответе, защищает от исключений NullPointerException):
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;
}
}