雖然新的Java 8 Stream
API我開始納悶,爲什麼不打轉轉:爲什麼地圖<K,V>不能擴展功能<K,V>?
public interface Map<K,V> extends Function<K, V>
甚至:
public interface Map<K,V> extends Function<K, V>, Predicate<K>
這將是相當容易的Map
default
方法來實現interface
:
@Override default boolean test(K k) {
return containsKey(k);
}
@Override default V apply(K k) {
return get(k);
}
而且它將允許使用Map
在map
方法:
final MyMagicMap<String, Integer> map = new MyMagicHashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.put("D", 4);
final Stream<String> strings = Arrays.stream(new String[]{"A", "B", "C", "D"});
final Stream<Integer> remapped = strings.map(map);
或者在一個filter
方法作爲Predicate
。
我發現一個Map
我的用例中的很大一部分正好是構造或類似構造 - 作爲重新映射/查找Function
。
那麼,爲什麼JDK設計者在重新設計Java 8的時候沒有決定將這個功能添加到Map
?
我認爲關於'map :: get'中烘焙的觀點,而不是'getOrDefault'或'computeIfAbsent'或者其他任何如果迄今爲止最引人注目的論證。我可以看到'null'會成爲一個問題,尤其是'Stream'會像'NONNULL'一樣開始。感謝您對設計決策的寶貴意見! – 2015-04-01 16:43:08