在一段时间后从缓存中删除项目?

时间:2018-01-23 04:55:35

标签: java caching hashmap iterator

我正在尝试创建一个包含messageID和responsePayload(两个bytes [])的缓存,并确保缓存中的每个项目在5秒后过期。这是我目前正在尝试做的事情。

我有以下课程:

public class CacheObject {
    public byte[] responsePayload;
    public long time;

    public CacheObject(byte[] responsePayload) {
        this.responsePayload = responsePayload;
        this.time = System.currentTimeMillis();
    }
}

使用这个类我创建了以下缓存,其中messageID作为键,CacheObject作为值

private static HashMap<byte[], CacheObject> cache = new HashMap<byte[], CacheObject>();

然后每当我循环遍历程序的主要部分时,我就调用一个函数:

private static void updateCache() {
    Collection times = cache.values();
    Iterator itr = times.iterator();

    while(itr.hasNext()) {
        CacheObject cacheObject = itr.next();
        if(System.currentTimeMillis() - cacheObject.time > 5000) {
            itr.remove();
        }
    }
}

但是我面临的问题是我似乎无法将迭代器对象分配给此行中的CacheObject:

CacheObject cacheObject = itr.next();

我已经看过一些建议这样做的帖子,但它似乎对我不起作用。有没有解决此问题的方法,还是有更好的方法来实现此缓存删除?

1 个答案:

答案 0 :(得分:2)

不要使用原始类型!您收到该错误,因为您的迭代器未正确输入。声明为:

Collection<CacheObject> times = cache.values();
Iterator<CacheObject> itr = times.iterator();

修改

有更好的方法来实施updateCache方法:

private static void updateCache() {
    cache.values().removeIf(c -> System.currentTimeMillis() - c.time > 5000);
}

其中c的类型为CacheObject,与地图的值类型相匹配。

检查Collection.removeIf方法文档以供进一步参考。