Есть ли способ, которым я могу поместить целый объект Entry
объект Map
например:
map.put(entry);
вместо передачи пары ключ-значение, например:
map.put(key,value);
Есть ли способ, которым я могу поместить целый объект Entry
объект Map
например:
map.put(entry);
вместо передачи пары ключ-значение, например:
map.put(key,value);
Я искал методы интерфейса 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
реализации.
Чтобы создать экземпляр 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);
}
Guava ImmutableMap.Builder
принимает записи напрямую.
Очевидно, что это напрямую не изменяет существующую Map
, но вполне может поцарапать тот же зуд.
Решение, если вы используете 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