虽然新的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