Java Map <string,myobject =“”> to Map <string,string =“”>

时间:2015-11-02 11:52:08

标签: java maps

我有一张地图,我想将其转换为地图。第一个Map中的键将等于第二个中的键。 MyObject有一个属性我想用作第二个映射的值。所以我现在拥有的是一个for循环:

for (Map.Entry<String, MyObject> entry : originalMap.getTextMessages().entrySet()) {
  newMap.put(entry.getKey(), entry.getValue().getStringValue());
}

现在我感觉它变得更容易了......任何人都可以对此有所了解吗?我们顺便使用Java 7但是如果你有一些聪明的Java 8功能,请分享它。

4 个答案:

答案 0 :(得分:3)

Java 8 Streams非常直接:

Map<String,String> newMap = 
    originalMap.entrySet().stream().collect(Collectors.toMap(e->e.getKey(),e->e.getValue().getStringValue()));

在Java 7中,我认为你不能用比现有代码更少的代码来实现它。

答案 1 :(得分:0)

这是另一个带有流和BiConsumer的Java 8示例,全部采用main方法:

public static void main(String[] args) throws Exception {
    class MyObject {
        String s;
        MyObject(String s) {
            this.s = s;
        }
        String getStringValue() {
            return s;
        }
    }
    Map<String, MyObject> original = new HashMap<String, MyObject>();
    original.put("original", new MyObject("0"));
    Map<String, String> converted = new HashMap<String, String>();
    // iterates each entry and puts the conversion in the new map
    original.forEach((s,m) -> {converted.put(s, m.getStringValue());});
    System.out.println(converted);
}

<强>输出

{original=0}

答案 2 :(得分:0)

在Java7中,您可以借助Apache commons集合来实现它:

import org.apache.commons.collections4.MapUtils;

Map<String, String> newMap = MapUtils.transformedMap(originalMap, TransformerUtils.<String>nopTransformer(), new Transformer<Object, String>() {
        @Override
        public String transform(final Object objectValue) {
            return objectValue.toString();
        }
    });

答案 3 :(得分:0)

您可以在番石榴的帮助下做到这一点:

import org.guava.collect.Maps;

Map<String, String> newMap = Maps.transformEntries(oldMap, new Maps.EntryTransformer<String, Object, String>() {
            @Override
            public String transformEntry(@Nullable String key, @Nullable Object value) {
                return value == null ? null : value.toString();
            }
        });