我正在尝试创建一个包含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();
我已经看过一些建议这样做的帖子,但它似乎对我不起作用。有没有解决此问题的方法,还是有更好的方法来实现此缓存删除?
答案 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
方法文档以供进一步参考。