有什么方法可以将整个Entry
对象放到Map
对象中,如:
map.put(entry);
而不是传递键值对,如:
map.put(key,value);
答案 0 :(得分:5)
我搜索了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
的实施方式。
答案 1 :(得分:3)
要使用条目实例化地图(与Google Guava库中的Arrays.asList(T... a)
或Sets.newHashSet(T... a)
相同,我发现了这一点:
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);
}
答案 2 :(得分:0)
番石榴的ImmutableMap.Builder
takes entries directly。
显然,这不会直接修改现有的Map
,但很可能会刮擦相同的痕迹。
答案 3 :(得分:-3)
使用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