映射地图键的最佳方法

时间:2016-08-17 04:02:33

标签: java

我想在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));

2 个答案:

答案 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",然后您可以将其用作原始地图的关键字。

说了这么多,我认为你建议的简单代码是最好的选择。