Scala中是否有SoftHashMap?
发布时间:2020-12-16 18:56:54 所属栏目:安全 来源:网络整理
导读:我知道 this question for java,但这些实现似乎都不适合scala.collection.JavaConversions. 我正在寻找一些简单的东西(例如单个文件,而不是整个库)来实现SoftHashMap,以便它可以很好地与Scala Map一起使用(即支持getOrElseUpdate,解压缩和其余的Scala Map方
我知道
this question for java,但这些实现似乎都不适合scala.collection.JavaConversions.
我正在寻找一些简单的东西(例如单个文件,而不是整个库)来实现SoftHashMap,以便它可以很好地与Scala Map一起使用(即支持getOrElseUpdate,解压缩和其余的Scala Map方法). 解决方法
实施灵感来自
this java
WeakHashMap :
import scala.collection.mutable.{Map,HashMap} import scala.ref._ class SoftMap[K,V <: AnyRef] extends Map[K,V] { class SoftValue[K,+V <: AnyRef](val key:K,value:V,queue:ReferenceQueue[V]) extends SoftReference(value,queue) private val map = new HashMap[K,SoftValue[K,V]] private val queue = new ReferenceQueue[V] override def += (kv: (K,V)): this.type = { processQueue val sv = new SoftValue(kv._1,kv._2,queue) map(kv._1) = sv this } private def processQueue { while (true) { queue.poll match { case Some(sv:SoftValue[K,_]) => map.remove(sv.key) case _ => return } } } override def get(key: K): Option[V] = map.get(key) match { case Some(sv) => sv.get match { case v:Some[_] => v case None => {map.remove(key); None} } case None => None } override def -=(key: K):this.type = { processQueue map.remove(key) this } override def iterator: Iterator[(K,V)] = { processQueue map.iterator.collect{ case (key,sv) if sv.get.isDefined => (key,sv.get.get) } } override def empty:SoftMap[K,V] = new SoftMap[K,V] override def size = {processQueue; map.size} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |