有失效的标记

public class AgingMark<K> {
    //标记map
    private final ConcurrentHashMap<K,Long> markMap = new ConcurrentHashMap(1);

    // 刷新标记事件
    public void refreshMark(K k, int time, TimeUnit timeUnit) {
        markMap.put(k, System.currentTimeMillis() + timeUnit.toMillis(time));
    }
    // 移出标记
    public boolean reomveMark(K k) {
        return markMap.remove(k) != null;
    }
    // 检测使用拥有指定标记
    public boolean hasMark(K k) {
        Long time = markMap.get(k);
        if(time == null) {
            return false;
        }
    }
    // 是否没有任何标记
    public boolean isEmpty() {
        return markMap.isEmpty();
    }
    // 是否没有任何标记
    public void tryRemoveExpire(Consumer<K> consumer) {
        if(markMap.isEmpty()) {
            return;
        }
        long now = System.currentTimeMillis();
        markMap.entrySet().removeIf(k -> {
            // 注意,这里是先执行回调后后移出
            if(k.getValue() < now) {
                if(consumer != null) {
                    consumer.accept(k.getKey())
                }
                return ture;
            } else {
                return false;
            }
        });
    }

    // 获取指定key的过期时间
    public long getExpireTime(K k) {
        Long time = markMap.get(k);
        if(time == null) {
            return 0;
        }
        long expire = time - System.currentTimeMillis();
        if(expire <= 0) {
            markMap.remove(k);
            return 0;
        }
    }

    // 当前拥有的所有key
    public Set<K> returnKeysAndClear() {
        Set<K> keys = new HashSet<>(markMap.keySet());
        markMap.clear();
        return keys;
    }
    // 清除所有标记
    public void clear() {
         markMap.clear();
    }

    // 遍历所有未过期的标记
    public void walkAll(BiConsumer<K,Long> walker) {
          markMap.keySet().foreach(
              k ->  {
                  long expire = getExpireTime(k);
                  if(expire > 0) {
                      walker.accept(k, expire);
                  }
              }
          );
    }

    // 注意,该接口返回的数量,只是当前标记集合数据的数量,不代表当前还未过去的标记数量
    public int size() {
        return markMap.size();
    }

}