Java - Как создать новую Запись (ключ, значение)

Я хотел бы создать новый объект это так же к Util.Map.Entry это будет содержать структуру key, value.

Проблема состоит в том, что я не могу инстанцировать a Map.Entry потому что это - интерфейс.

Делает любой знает, как создать новый универсальный объект ключа/значения для Карты. Запись?

265
задан Eric Leschinski 26 September 2015 в 12:39
поделиться

4 ответа

Вы можете просто реализовать интерфейс Map.Entry самостоятельно:

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;
    }
}

А затем использовать его:

Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
77
ответ дан 23 November 2019 в 02:26
поделиться

Попробуйте Maps.immutableEntry из Guava

Это имеет то преимущество, что он совместим с Java 5 (в отличие от AbstractMap.SimpleEntry , который требует Java 6.)

48
ответ дан 23 November 2019 в 02:26
поделиться

Я определил общий класс Pair, который использую все время. Это великолепно. В качестве бонуса, определяя статический фабричный метод (Pair.create), мне нужно писать аргументы типа только вдвое реже.

public class Pair<A, B> {

    private A component1;
    private B component2;

    public Pair() {
            super();
    }

    public Pair(A component1, B component2) {
            this.component1 = component1;
            this.component2 = component2;
    }

    public A fst() {
            return component1;
    }

    public void setComponent1(A component1) {
            this.component1 = component1;
    }

    public B snd() {
            return component2;
    }

    public void setComponent2(B component2) {
            this.component2 = component2;
    }

    @Override
    public String toString() {
            return "<" + component1 + "," + component2 + ">";
    }

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                            + ((component1 == null) ? 0 : component1.hashCode());
            result = prime * result
                            + ((component2 == null) ? 0 : component2.hashCode());
            return result;
    }

    @Override
    public boolean equals(Object obj) {
            if (this == obj)
                    return true;
            if (obj == null)
                    return false;
            if (getClass() != obj.getClass())
                    return false;
            final Pair<?, ?> other = (Pair<?, ?>) obj;
            if (component1 == null) {
                    if (other.component1 != null)
                            return false;
            } else if (!component1.equals(other.component1))
                    return false;
            if (component2 == null) {
                    if (other.component2 != null)
                            return false;
            } else if (!component2.equals(other.component2))
                    return false;
            return true;
    }

    public static <A, B> Pair<A, B> create(A component1, B component2) {
            return new Pair<A, B>(component1, component2);
    }

}
4
ответ дан 23 November 2019 в 02:26
поделиться

Есть public static class AbstractMap.SimpleEntry. Пусть часть имени Abstract не вводит вас в заблуждение: на самом деле это НЕ класс abstract (но его верхний уровень AbstractMap является таковым).

Тот факт, что это статический вложенный класс, означает, что вам НЕ нужен вложенный AbstractMap экземпляр, чтобы инстанцировать его, поэтому что-то вроде этого компилируется нормально:

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

Как было отмечено в другом ответе, Guava также имеет удобный статический фабричный метод Maps. immutableEntry который вы можете использовать.


Вы сказали:

Я не могу использовать Map.Entry сам по себе, потому что, очевидно, это объект только для чтения, который я не могу инстанцировать new instanceof

Это не совсем точно. Причина, по которой вы не можете создать его напрямую (т.е. с помощью new), заключается в том, что это интерфейс Map.Entry.


Предостережение и совет

Как отмечено в документации, AbstractMap.SimpleEntry является @since 1.6, так что если вы застряли на 5.0, то он вам недоступен.

Чтобы найти другой известный класс, который реализует Map.Entry, вы можете обратиться непосредственно к javadoc. Из версии Java 6

Interface Map.Entry

All Known Implementing Classes:

К сожалению, в версии 1.5 нет списка известных реализующих классов, которые вы можете использовать, так что вы можете застрять с реализацией своего собственного.

741
ответ дан 23 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: