Durante la riproduzione in giro con il nuovo Java 8 Stream
API ho avuto modo di chiedersi, perché non:Perché la mappa <K,V> non estende la funzione <K,V>?
public interface Map<K,V> extends Function<K, V>
O anche:
public interface Map<K,V> extends Function<K, V>, Predicate<K>
Sarebbe abbastanza facile da implementare con default
metodi sul Map
interface
:
@Override default boolean test(K k) {
return containsKey(k);
}
@Override default V apply(K k) {
return get(k);
}
E sarebbe consentire l'uso di un Map
in un metodo 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);
O come un Predicate
in un metodo filter
.
Trovo che una parte significativa dei miei casi d'uso per un Map
sia esattamente quel costrutto o uno simile - come rimappatura/ricerca Function
.
Quindi, perché i progettisti JDK non hanno deciso di aggiungere questa funzionalità allo Map
durante la riprogettazione per Java 8?
Penso che il punto su cuocere in 'map :: get' piuttosto che in' getOrDefault' o 'computeIfAbsent' o quant'altro se l'argomento più convincente finora. Posso vedere che 'null' sarebbe un problema, specialmente visto che molti' Stream' inizieranno la vita come 'NONNULL'. Grazie per la tua preziosa visione della decisione di progettazione! –