[英]Why methods from Collections were not put in AbstractCollection?
[英]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.