2017-03-23 4 views
0

Y at-il une classe d'utilité dans Google Guava qui me permet de décorer un Map pour le faire fonctionner comme un Set?Décorer une carte pour se comporter comme un ensemble en utilisant la goyave

HashSet est implémenté en utilisant un HashMap<K, Object> où la valeur est toujours la même instance de Object. Je voudrais faire la même chose avec un retour de MapLoadingCache:

Set<K> mySet = XXX.decorate(CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build().asMap()) 

Pour me donner un Set dont les données expire 10 secondes après que je l'insérer.

Y a-t-il une telle classe dans Guava? J'ai vu ForwardingSet mais cela ne fonctionne qu'avec une autre instance Set.

Répondre

3

Vous pouvez utiliser Collections#newSetFromMap(Map<K, Boolean>) de JDK:

Set<K> mySet = Collections.newSetFromMap(
      CacheBuilder.newBuilder() 
        .expireAfterWrite(10, TimeUnit.SECONDS) 
        .<K, Boolean>build() 
        .asMap()); 
+0

Merci - donc la raison pour laquelle il est pas Goyave est parce qu'il est déjà dans le JDK - qui va me apprendre à aller à Goyave premier! – Rich

+2

En fait, il y a une telle méthode dans Guava - ['Sets # newSetFromMap (Map)'] (https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/Sets .html # newSetFromMap-java.util.Map-) mais il est déprécié et a été là pour les anciennes bases de code parce que 'Collections' n'avait pas eu avant JDK 1.6 (et que Gava a utilisé pour supporter JDK 1.5+). – Xaerxess