簡體   English   中英

集合函數方法調用get,put等嗎?

[英]Do Collections functional methods call get, put, etc?

我花了很多年時間使用Java 1.6(維護傳統工具)並且剛剛開始遷移到1.8。 一個重大變化是java.util.Collections套件中的功能方法。 對我來說最大的擔憂是我有幾個集合擴展,它們需要仔細檢查或修改算法。 默認方法是調用已經定義的put(..),get(...),remove(..)等函數還是我必須做一個重大的返工來使這個工作?

例如(忽略空檢查等等只包含值<= 10的地圖)

public class LimitedMap extends HashMap<String, Integer>{
    @Override
    public Integer put(String key, Integer value){
        if(value> 10) throw new IllegalArgumentException();
        return super.put(key, value);
    }

    @Override
    public Integer computeIfAbsent(String key, Function<? super String, ? extends Integer> mappingFunction) {
        return super.computeIfAbsent(key, mappingFunction);
    }
}

使用這對函數:我是否還需要進行詳細的覆蓋並將新的檢查放入computeIfAbsent函數中?

唯一可以確定只能使用Java 8之前的接口方法的方法是,如果你能以某種方式委托接口中的默認方法實現(在本例中為Map<K, V> )。

也就是說,如果你可以寫下面的東西(你不能)。

public class LimitedMap extends HashMap<String, Integer> {

    @Override
    public Integer computeIfAbsent(String key,
            Function<? super String, ? extends Integer> mappingFunction) {

        return Map.super.computeIfAbsent(key, mappingFunction);
    }
}

不幸的是,這不合法,因為你只能調用你覆蓋的方法(這里是來自HashMap<String, Integer> ),而不是繼承方法可能被覆蓋的方法(這些是super方法調用的常規規則) )。

因此,我看到的唯一解決方法是在輔助類中創建接口默認方法實現的副本,如下所示:

public class Maps {

    public static <K, V> V computeIfAbsent(Map<K, V> map,
            K key, Function<? super K, ? extends V> mappingFunction) {
        Objects.requireNonNull(mappingFunction);
        V v;
        if ((v = map.get(key)) == null) {
            V newValue;
            if ((newValue = mappingFunction.apply(key)) != null) {
                map.put(key, newValue);
                return newValue;
            }
        }

        return v;
    }
}

這是java.util.Map的實現,作為靜態方法,通過操作實例的附加參數map進行增強。

有了這樣的助手類,你現在可以寫了

public class LimitedMap extends HashMap<String, Integer> {

    @Override
    public Integer computeIfAbsent(String key,
            Function<? super String, ? extends Integer> mappingFunction) {

        return Maps.computeIfAbsent(this, key, mappingFunction);
    }
}

這不是最漂亮的解決方案,但應該只需要付出有限的努力。

暫無
暫無

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

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