加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读