java - Java - 将<Map.Entry<K, V> >转换为HashMap <K, V>

在我的代码中,我从map创建了一个Set<Map.Entry<K, V>> ,现在,我想重新创建相同的map表单,所以,我想转换HashSet<Map.Entry<K, V>> 回到HashMap<K, V>,Java是否有一个本地调用来执行这个操作,或者我必须在集合元素上手动构建映射。

时间:

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


 }



不管这里的目的是什么,但是,如果在set中进行任何更改也会反映在map as set returned by map,entrySet is backup by map ,请参见下面的javadoc

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

它不支持添加或addAll操作。

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


Map<Integer, String> mapFromSet = set.stream()


 .collect(Collectors.toMap(Entry::getKey, Entry::getValue));



如果遇到重复键,会引发IllegalStateException

相当短的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));



从Guava 19开始你可以使用ImmutableMap.copyOf(Iterable<Map.Entry<K,V>>)

这些是常见库中的一些toMap实用程序,但是,不幸的是,它们都没有直接支持Set所以,你需要先做Set#toArray()

Lang的Commons ArrayUtils.toMap

Map<Object, Object> map = ArrayUtils.toMap(entrySet.toArray());



// to recover the type...


@SuppressWarnings("unchecked")


Map<K, V> typedMap = (Map<K, V>)(Map<?, ?>)map;



Commons集合"'MapUtils.putAll

Map<K, V> map = MapUtils.putAll(new HashMap<K, V>(), entrySet.toArray());



Java 9 的Map.ofEntries


 // convert to array and recover the type...


 @SuppressWarnings("unchecked")


 Map<K, V> map = Map.ofEntries(entrySet.toArray(new Map.Entry[0]));



 // You need to copy again if you want a mutable one


 Map<K, V> hashmap = new HashMap<>(map);



在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(HashMap::new,(t, u) -> t.put(u.getKey(), u.getValue()), 


(Map mapToReturn, Map otherMap) ->


 {


 otherMap.entrySet().forEach((Map.Entry entry) -> {


 mapToReturn.put(entry.getKey(),entry.getValue());


 });


 return mapToReturn;}););



...