如何将此转换为scala,因为迭代器没有删除方法?
iter定义如下:
Iterator<Integer> iter = cache.keySet().iterator();
其中cache是一个hashmap
while (iter.hasNext()) {
int num = iter.next();
if (!part.contains(num)){
iter.remove();
}
}
答案 0 :(得分:2)
如果您的实际目标是从缓存中过滤某些键,则可以直接执行此操作,而无需循环和迭代器:
val cache = Map("a" -> 3, "b" -> 5, "c" -> 7)
val part = Set("x", "y", "b")
val filteredCache = cache.filter{ case (k, _) => part.contains(k) }
// prints `Map(b -> 5)`, because "a" and "c" not in `part`
println(filteredCache)
修改强>
正如@ SymY4绝对正确指出的那样,filter
和filterKeys
的行为完全不同:filter
返回一个新的Map(不可变版本),或者就地过滤元素(可变版本) )。但是,filterKeys
仅构建原始集合的筛选视图。因此,不建议重复调用filterKeys
,因为它会将越来越多的视图叠加在一起。
但是,filter
的解决方案仍然有效。
答案 1 :(得分:1)
在地图上执行大量过滤会最终导致生成的地图太慢。因为在到达实际的缓存存储之前,您需要应用已添加的所有过滤器。我建议使用--
语法
scala> Map("a" -> 1, "b" -> 2, "c" -> 3)
res0: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3)
scala> res0 -- Set("x", "y", "b")
res1: scala.collection.immutable.Map[String,Int] = Map(a -> 1, c -> 3)
答案 2 :(得分:0)
也许是这样
val it = Iterator.continually(hashMap.headOption).takeWhile(_.isDefined).flatten
for ((key, value) <- it) {
hashMap.remove(key)
... //do something here with value
}
其中hashMap
是可变的HashMap实例。