Pregunta

Uno de mis favoritos de Apache Commons-colecciones fue el LazyMap que utilizar un transformador para crear instancias de valores sobre la marcha cuando se hace map.get(newKey); // Will not return null!.

¿Por qué no google colecciones tienen la misma?

¿Fue útil?

Solución

Otros consejos

Oye mira ! no !

Se llama new MapMaker().makeComputingMap(Function<? super K, ? extends V> computer)

impresionante.

Tenga en cuenta que el fabricante mapa es una fábrica - se puede hacer uno, establecer todos los tipos de referencia de objetos, propiedades de expansión (e incluso oponerse tiempo de caducidad!), Y luego ir sobre la creación de una gran cantidad de mapas (u otros tipos de computación ) con una línea llama.

por ejemplo. como casi todo lo demás acerca de la biblioteca de Google-colecciones, que es muy bueno - una vez que haya descubierto en 'eso' es

Sugiero que escribir su propio

public class LazyMap<K, V> extends ForwardingMap<K, V> {
    final Function<? super K, ? extends V> factory;
    final Map<K, V> delegate;

    public static <K, V> LazyMap<K, V> lazyMap(final Map<K, V> map, final Supplier<? extends V> supplier) {
        return new LazyMap<>(map, supplier);
    }

    public static <K, V> LazyMap<K, V> lazyMap(final Map<K, V> map, final Function<? super K, ? extends V> factory) {
        return new LazyMap<>(map, factory);
    }

    private LazyMap(final Map<K, V> map, final Function<? super K, ? extends V> factory) {
        this.factory = factory;
        this.delegate = map;
    }

    private LazyMap(final Map<K, V> map, final Supplier<? extends V> supplier) {
        this.factory = Functions.forSupplier(supplier);
        this.delegate = map;
    }

    @Override
    protected Map<K, V> delegate() {
        return delegate;
    }

    @Override
    public V get(final Object key) {
        if (delegate().containsKey(key) == false) {
            @SuppressWarnings("unchecked")
            final K castKey = (K) key;
            final V value = factory.apply(castKey);
            delegate().put(castKey, value);
            return value;
        }
        return delegate().get(key);
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top