我想在HashMap中转换键。该地图具有lower_underscore键,但预期的地图应具有camelCase键。地图也可能包含空值。
执行此操作的直接代码如下:
Map<String, Object> a = new HashMap<String, Object>() {{
put("foo_bar", 100);
put("fuga_foga", null); // A value may be null. Collectors.toMap can't handle this value.
}};
Map<String, Object> b = new HashMap<>();
a.forEach((k,v) -> b.put(toCamel(k), v));
我想知道像Guava的Maps.transformValues()或Maps.transformEntries()这样做的方法,但这些方法只是转换值。
Collectors.toMap()也很接近,但是当存在null值时,此方法抛出NullPointerException。
Map<String, Object> collect = a.entrySet().stream().collect(
Collectors.toMap(x -> toCamel(x.getKey()), Map.Entry::getValue));
答案 0 :(得分:2)
如果你绝对想用流来解决这个问题,你可以这样做:
Map<String, Object> b = a.entrySet()
.stream()
.collect(HashMap::new,
(m, e) -> m.put(toCamel(e.getKey()), e.getValue()),
HashMap::putAll);
但是我发现&#34;传统&#34;你问题中显示的方式更容易阅读:
Map<String, Object> b = new HashMap<>();
a.forEach((k,v) -> b.put(toCamel(k), v));
答案 1 :(得分:1)
这是作为评论,但是时间太久了。
想要像Guava的Maps.transformValues()或Maps.transformEntries()这样的东西我认为没有多大意义。
这些方法返回原始地图的视图,当你得到一些时
使用键的值,然后通过您指定的某个函数转换该值。
(我可能在这里错了,因为我不熟悉番石榴,但我根据文档做出这些假设)
如果您想要“转换”键,那么您可以通过为地图编写一个wapper来实现:
public class KeyTransformingMap<K, V> implements Map {
private Map<K, V> original;
private Function<K, K> reverseTransformer;
public V get(Object transformedKey) {
K originalKey = reverseTransformer.apply((K) transformedKey);
return original.get(originalKey);
}
// delegate all other Map methods directly to original map (or throw UnsupportedOperationException)
}
在你的情况下,你有一个带蛇盒钥匙的地图,但想要骆驼箱钥匙,
reverseTransformer
函数将接受一个驼峰大小写字符串并返回一个蛇案例字符串
I.e reverseTransformer.apply("snakeCase")
返回"snake_case"
,然后您可以将其用作原始地图的关键字。
说了这么多,我认为你建议的简单代码是最好的选择。