Во время игры вокруг с новым 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>
Было бы довольно легко реализовать с помощью default
методов на Map
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);
Или как Predicate
в методе filter
.
Я нахожу, что значительная часть моих вариантов использования для Map
является именно такой конструкцией или аналогичной - как переназначение/поиск Function
.
Итак, почему дизайнеры JDK не решили добавить эту функцию к Map
во время редизайна для Java 8?
Я думаю, что вопрос о выпечке в 'map :: get', а не' getOrDefault' или 'computeIfAbsent', или что-то еще, если это самый убедительный аргумент. Я вижу, что «null» будет проблемой, особенно, поскольку «поток» начнет жизнь как «НЕИСПРАВНОСТЬ». Благодарим вас за ценное понимание дизайнерского решения! –