将 Set<Map.Entry<K, V>> 转换为 HashMap<K, V>

新手上路,请多包涵

在我的代码中的某个时刻,我从地图创建了一个 Set<Map.Entry<K, V>> 。现在我想重新创建相同的地图形式,所以我想将 HashSet<Map.Entry<K, V>> 转换回 HashMap<K, V> 。 Java 是否有执行此操作的本机调用,或者我是否必须遍历集合元素并手动构建映射?

原文由 Joeblackdev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 829
2 个回答

java中没有内置API可以在 HashSetHashMap 之间直接转换,你需要遍历集合并使用 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());
    }

Though what is the purpose here, if you do any changes in Set that will also reflect in Map as set returned by Map.entrySet is backup by Map 。请参阅下面 javadoc

Set> java.util.Map.entrySet()

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

原文由 harsh 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

如果遇到重复键,将抛出 IllegalStateException

原文由 Tagir Valeev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题