簡體   English   中英

Java:編寫通用HashMap合並方法的正確方法是什么?

[英]Java: What's the right way of writing a generic HashMap merge method?

這可能是一個基本的Java問題,但是我不知何故找不到適合Google的正確解決方案的關鍵字。

我有幾對HashMap對象,我需要以一種簡單明了的方式合並每對對象:如果兩個鍵匹配,則將兩個值相加並將其和存儲在第一張地圖中。 所以我可能會有類似的東西:

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

編寫可合並所有這些類型的通用mergeMaps方法的正確方法是什么,而不是每種類型都具有3個或多或少相同的方法?

沒有通用的方法可以添加不同類型的數字。 您將不得不告訴該方法如何將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM