Как ввести запись на карту?

Есть ли способ, которым я могу поместить целый объект Entry объект Map например:

map.put(entry);

вместо передачи пары ключ-значение, например:

map.put(key,value);

Ответ 1

Я искал методы интерфейса Map, но нет метода, который берет запись и помещает ее в карту. Поэтому я его реализовал самостоятельно используя немного наследования и интерфейсы Java 8.

import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Maps {

    // Test method
    public static void main(String[] args) {
        Map.Entry<String, String> entry1 = newEntry("Key1", "Value1");
        Map.Entry<String, String> entry2 = newEntry("Key2", "Value2");

        System.out.println("HashMap");
        MyMap<String, String> hashMap = new MyHashMap<>();
        hashMap.put(entry1);
        hashMap.put(entry2);

        for (String key : hashMap.keySet()) {
            System.out.println(key + " = " + hashMap.get(key));
        }

        System.out.println("\nTreeMap");
        MyMap<String, String> treeMap = new MyTreeMap<>();
        treeMap.put(entry1);
        treeMap.put(entry2);


        for (String key : treeMap.keySet()) {
            System.out.println(key + " = " + treeMap.get(key));
        }
    }


    /**
     * Creates a new Entry object given a key-value pair.
     * This is just a helper method for concisely creating a new Entry.
     * @param key   key of the entry
     * @param value value of the entry
     * 
     * @return  the Entry object containing the given key-value pair
     */
    private static <K,V> Map.Entry<K,V> newEntry(K key, V value) {
        return new AbstractMap.SimpleEntry<>(key, value);
    }

    /**
     * An enhanced Map interface.
     */
    public static interface MyMap<K,V> extends Map<K,V> {

        /**
         * Puts a whole entry containing a key-value pair to the map.
         * @param entry 
         */
        public default V put(Entry<K,V> entry) {
            return put(entry.getKey(), entry.getValue());
        }
    }

    /**
     * An enhanced HashMap class.
     */
    public static class MyHashMap<K,V> extends HashMap<K,V> implements MyMap<K,V> {}

    /**
     * An enhanced TreeMap class.
     */
    public static class MyTreeMap<K,V> extends TreeMap<K,V> implements MyMap<K,V> {}
}

Интерфейс MyMap - это просто интерфейс, расширяющий интерфейс Map добавив еще один метод, public default V put(Entry<K,V> entry). Помимо простого определения метода, кодировка по умолчанию кодируется слишком. Сделав это, мы теперь можем добавить этот метод в любой класс, который реализует интерфейс Map, просто определив новый класс, который реализует MyMap и расширяя класс реализации карты по нашему выбору. Все из этого в одной строке! Это показано в нижней части кода выше, где два классы, каждый из которых расширяет HashMap и TreeMap реализации.

Ответ 2

Чтобы создать экземпляр Map с записями (так же, как вы можете сделать Arrays.asList(T... a) или Sets.newHashSet(T... a) в библиотеке Google Guava, я нашел это:

import java.util.AbstractMap;
import java.util.Map;

public class MapWithEntries {

    private static final Map.Entry<String, String> ENTRY_1 = new AbstractMap.SimpleEntry<>("A", "Hello");
    private static final Map.Entry<String, String> ENTRY_2 = new AbstractMap.SimpleEntry<>("B", "World");

    private static final Map<String, String> MAP_WITH_ENTRIES = Map.ofEntries(ENTRY_1, ENTRY_2);
}

Ответ 3

Guava ImmutableMap.Builder принимает записи напрямую.

Очевидно, что это напрямую не изменяет существующую Map, но вполне может поцарапать тот же зуд.

Ответ 4

Решение, если вы используете Java Platform SE 8:

Классы SimpleEntry и SimpleImmutableEntry реализуют интерфейс Map.Entry

import java.util.AbstractMap.SimpleEntry;
import java.util.AbstractMap.SimpleImmutableEntry;

List<Map.Entry<K, V>> map = new ArrayList<>(); 
map.add(new SimpleEntry<K,V>(key,value));
map.add(new SimpleImmutableEntry<K,V>(key,value)); // constructs immutable entries for thread-safe operation