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

2022-09-01 00:18:42

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


答案 1

更简单的 Java-8 解决方案,包括:Collectors.toMap

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

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


答案 2

Java中没有内置的API用于在和之间直接转换,您需要遍历设置并使用填充映射。HashSetHashMapEntry

一种方法:

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());
    }

虽然这里的目的是什么,但如果你做了任何更改,那也会反映在 由 备份返回的集合中。见下文:SetMapMap.entrySetMapjavadoc

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

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


推荐