如何转换java地图的值?

时间:2016-12-08 20:07:10

标签: java collections

我有TreeMap<String, WrappedObject>我希望将其转换为新的独立TreeMap<String, UnwrappedObject>。最简单的方法是什么?

4 个答案:

答案 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的其他方法会受到重新插入每个密钥的成本的影响。