我有TreeMap<String, WrappedObject>
我希望将其转换为新的独立TreeMap<String, UnwrappedObject>
。最简单的方法是什么?
答案 0 :(得分:2)
假设unwrap()
打开WrappedObject
,你就不会比这简单得多。
TreeMap<String, UnwrappedObject> out = new TreeMap<>();
for(Entry<String, WrappedObject> entry : in.entrySet())
out.put(entry.getKey(), unwrap(entry.getValue()));
答案 1 :(得分:2)
这是Map.forEach
派上用场的其中一种情况:
Map<String, WrappedObject> in = ... ;
Map<String, UnwrappedObject> out = new TreeMap<>();
in.forEach((k, v) -> out.put(k, v.unwrap()));
(假设WrappedObject.unwrap()
做了显而易见的事。)
这里简洁的一大优点是Map.forEach
分别传递键和值,而循环或流方法需要使用Map.Entry
实例并调用其getter来获取键和值。 / p>
答案 2 :(得分:1)
如果使用Java 8:
Map<String, UnwrappedObject> newMap = wrappedObjectMap.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().getWrappedObject());
// assuming this method exists to get the UnwrappedObject
此collects all entries of the old map using a collector在条目中使用相同的键(Map.Entry::getKey
相当于e -> e.getKey()
),并将值设置为展开对象的结果。
要获得TreeMap
类型的返回地图,请使用Collectors.toMap
that takes a supplier:
TreeMap<String, Object> newMap = wrappedObjectMap.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().getWrappedObject(),
(v1, v2) -> v1,
TreeMap::new));
// third parameter can be any merge function in this case since conflicts should not occur
答案 3 :(得分:0)
两个问题:你能否使用Guava,并且返回的地图是否需要写入,或者只是从中读取?
如果您可以使用Guava,并且只需要对转换后的地图进行读取权限,则可以使用Maps.transformValues(NavigableMap, Function)
。
这里的优点是除了值的转换之外几乎没有任何成本,但是保留了地图的可导航性。构造新TreeMap
的其他方法会受到重新插入每个密钥的成本的影响。