当值大于x时,从地图中删除的最佳方法是什么?

Bis*_*128 5 java concurrency date map

我正在尝试创建一个Map<String, Date>可以保存值,直到日期值> 1天.

是这样做的最佳方法是使用a ConcurrentHashMap然后创建一个每分钟左右迭代一次映射的线程,然后删除超过1天的值,或者,有更好的方法来执行此操作吗?

为了澄清,收到的日期消息不是当前时间,可以是之前的时间

谢谢

Joh*_*n B 7

编辑:好的,所以我编辑了以下所有内容以使用,Optional<Date>因为Guava的缓存不喜欢CallableCacheLoader返回,null并且您希望将其用作Map与密钥关联的值可能不存在的位置.

使用Guava的缓存

Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .expireAfterWrite(1, TimeUnit.DAYS)
   .build();
Run Code Online (Sandbox Code Playgroud)

加载缓存将是......

   LoadingCache<String, Optional<Date>> graphs = CacheBuilder.newBuilder()
   .expireAfterWrite(1, TimeUnit.DAYS)
   .build(
       new CacheLoader<String, Optional<Date>>() {
         public Optional<Date>load(Stringkey) throws AnyException {
           return Optional.absent();
         }
       });
Run Code Online (Sandbox Code Playgroud)

好的,所以我认为如果Date可能已经过去你想要的是将上面的内容包装成Cache一个ForwardingCache.SimpleForwardingCache.然后get,null如果Date值早于一天,则重载该方法以返回.

Cache<String, Optional<Date>> cache = new SimpleForwardingCache<>(grapsh){

      public Optional<Date>get(String key, Callable<Optional<Date>> valueLoader){
           Optional<Date> result = delegate().get(key, valueLoader);
           if (!result.isPresent() || olderThanADay(result.get()))
                return Optional.absent();
           else
                return result;
      }

      // since you don't really need a valueLoader you might want to add this.
      // this is in place of the LoadingCache, if use LoadingCache use 
      // ForwardingLoadingCache
      public Date get(String key){
          return get(key, 
               new Callable<Optional<Date>>(){
                 public Date call(){return Optional.absent();}
               }
      }
 }
Run Code Online (Sandbox Code Playgroud)