java keyset和entryset 将<Map.Entry<K,V>>转换为HashMap<K,V>




map keyset (4)

在我的代码中,我从地图创建了一个Set<Map.Entry<K, V>> 。 现在我想重新创建相同的地图表单,所以我想将HashSet<Map.Entry<K, V>>HashMap<K, V> 。 Java有一个本地调用这样做,或者我必须循环设置元素,并手动建立地图?


相当短的Java 8解决方案。 可以处理重复的密钥。

    Map<Integer, String> map = new HashMap<>();
    //fill in map
    Set<Map.Entry<Integer, String>> set = map.entrySet();
    Map<Integer, String> mapFromSet = set.stream().collect(Collectors.toMap(Entry::getKey,
      Entry::getValue,
      (a,b)->b));

编辑:谢谢Shossel谁应得到更多的信贷比我这样做


java中没有内置的API用于HashSetHashMap之间的直接转换,您需要遍历set和使用Entry填充地图。

一种方法:

Map<Integer, String> map = new HashMap<Integer, String>();
    //fill in map
    Set<Entry<Integer, String>> set = map.entrySet();

    Map<Integer, String> mapFromSet = new HashMap<Integer, String>();
    for(Entry<Integer, String> entry : set)
    {
        mapFromSet.put(entry.getKey(), entry.getValue());
    }

虽然这里的目的是什么,但是如果你在Set中做了任何改变,那Map.entrySet返回的Map也会反映在Map 。 见下面的javadoc

设置<Entry <Integer,String >> java.util.Map.entrySet()

返回此映射中映射的映射的Set视图。 该集合由地图支持,所以对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改了映射(除了通过迭代器自己的删除操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。 该集支持元素删除,通过Iterator.remove,Set.remove,removeAll,retainAll和Clear操作从映射中删除相应的映射。 它不支持add或addAll操作。



涉及Collectors.toMap更简单的Java-8解决方案:

Map<Integer, String> mapFromSet = set.stream()
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

如果遇到重复密钥,则会抛出IllegalStateException异常。







set