2010-02-08 10 views
10

Jednym z moich ulubionych ze zbiorów apache commons była LazyMap, która używa Transformatora do tworzenia wartości w locie podczas wykonywania map.get(newKey); // Will not return null!.Gdzie jest LazyMap google-collection?

Dlaczego kolekcje google nie mają tego samego?

Odpowiedz

7

od 10.0, zamiast tego guawa ma nową klasę CacheBuilder i jest zgodna z Gtt.

These are the differences.

+1

Dzięki za aktualizację - jesteś (teraz) bardziej "poprawny" niż I. – Stephen

+0

Główna różnica, że ​​CacheBuilder utworzy pamięć podręczną zamiast mapy . Alternatywny program MapBuilder wygeneruje ConcurrentMap, a niektóre metody zostaną uznane za przestarzałe, więc ... – takacsot

18

Hey look! It does!

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

niesamowite.

Pamiętaj, że Kreator map jest fabryką - możesz ją utworzyć, ustawić wszystkie typy odwołań do obiektów, właściwości ekspansji (a nawet czas wygasania obiektu!), A następnie utworzyć wiele map komputerowych (lub innych typów) z jednym połączeniem liniowym.

np. jak prawie wszystko w bibliotece kolekcji Google, to jest naprawdę dobre - kiedy już zorientujesz się, że "to" jest

+0

Dla nikogo, że ląduje tutaj ta została zaniechana, a teraz nienawidzę używać Chaches. https://code.google.com/p/guava-libraries/wiki/MapMakerMigration – pablisco

-1

Proponuję napisać własny

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); 
    } 

}