Java:What';编写通用HashMap合并方法的正确方法是什么?

Java:What';编写通用HashMap合并方法的正确方法是什么?,java,generics,merge,hashmap,Java,Generics,Merge,Hashmap,这可能是一个基本的Java问题,但不知何故,我无法为谷歌找到合适的关键字来提供合适的解决方案 我有几对HashMap对象,我需要以一种简单的方式合并每对对象:如果两个键匹配,将两个值相加,并将总和存储在第一个映射中。所以我可能会说: HashMap<String,Double> mapSD1, mapSD2; HashMap<String,Integer> mapSI1, mapSI2; HashMap<MyClassA,Float> mapCF1, mapC

这可能是一个基本的Java问题,但不知何故,我无法为谷歌找到合适的关键字来提供合适的解决方案

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

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

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

没有添加不同类型数的泛型方法。您必须告诉该方法如何添加
浮点
值、两个
整数
值等

因为您使用的是Java7,所以必须首先准备一些基础知识。您可以创建以下接口:

public interface BinaryOperator<T> {

    T apply(T t1, T t2);
}

不幸的是,我仍然在使用Java7。但是谢谢你anyway@IZ我已经完全改写了我的答案。这可能更符合您的要求?作为最佳实践,您应该使用
Map
而不是
HashMap
来保存对
HashMap
实例的引用。这通常是正确的——在创建集合时使用特定的实现类型,并使用接口类型保存它们的引用。如果您对所使用的类型有不必要的特定性,那么它会降低代码的可维护性——如果您选择不同的
Map
实现,那么您将被迫重构。
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}
}
merge(map, map2, Float::sum);