Java:编写泛型HashMap合并方法的正确方法是什么?

时间:2016-04-15 12:57:29

标签: java generics merge hashmap

这可能是一个基本的Java问题,但我无法找到合适的关键词来谷歌寻找合适的解决方案。

我有几对HashMap个对象,我需要以一种简单的方式合并每个相应的对:如果两个键匹配,将两个值相加并将总和存储在第一个映射中。所以我可能有类似的东西:

HashMap<String,Double> mapSD1, mapSD2;
HashMap<String,Integer> mapSI1, mapSI2;
HashMap<MyClassA,Float> mapCF1, mapCF2;

编写可以合并所有这些类型的通用mergeMaps方法的正确方法是什么,而不是每种类型都有3个或多或少相同的方法?

1 个答案:

答案 0 :(得分:0)

没有通用的方法来添加不同类型的数量。您必须告诉方法如何添加Float值,两个Integer值等。

由于您使用的是Java 7,因此您必须先准备一些地面。您可以创建以下界面:

public interface BinaryOperator<T> {

    T apply(T t1, T t2);
}

然后你可以这样做:

private static final BinaryOperator<Float> ADD_FLOATS = new BinaryOperator<Float>() {
    @Override
    public Float apply(Float t1, Float t2) {
        return t1 + t2;
    }
};

public static <K, V> void merge(Map<K, V> map1, Map<K, V> map2, BinaryOperator<V> op) {
    for (Map.Entry<K, V> e : map2.entrySet()) {
        V val = map1.get(e.getKey());
        if (val == null) {
            map1.put(e.getKey(), e.getValue());
        } else {
            map1.put(e.getKey(), op.apply(val, e.getValue()));
        }
    }
}

public static void main(String[] args) {
    Map<String, Float> map = new HashMap<>();
    map.put("A", 1.2F);
    map.put("B", 3.4F);
    Map<String, Float> map2 = new HashMap<>();
    map2.put("B", 5.6F);
    map2.put("C", 7.8F);
    merge(map, map2, ADD_FLOATS);
    System.out.println(map);   // prints {A=1.2, B=9.0, C=7.8}
}

当您升级到Java 8时,您将能够摆脱BinaryOperator(它已经存在),并且不需要创建ADD_FLOATS。你可以做到

merge(map, map2, Float::sum);