我有一张地图,我想将其转换为地图。第一个Map中的键将等于第二个中的键。 MyObject有一个属性我想用作第二个映射的值。所以我现在拥有的是一个for循环:
for (Map.Entry<String, MyObject> entry : originalMap.getTextMessages().entrySet()) {
newMap.put(entry.getKey(), entry.getValue().getStringValue());
}
现在我感觉它变得更容易了......任何人都可以对此有所了解吗?我们顺便使用Java 7但是如果你有一些聪明的Java 8功能,请分享它。
答案 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();
}
});