map.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 130 行

SCALA
130
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2006-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |                                         **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: Map.scala 14532 2008-04-07 12:23:22Z washburn $package scala.collection.jcl;/** A mutable map that is compatible with Java maps. * *  @author Sean McDirmid */trait Map[K,E] extends MutableIterable[Tuple2[K,E]] with scala.collection.mutable.Map[K,E] {  override def clear() = super[MutableIterable].clear;  override def isEmpty = super[MutableIterable].isEmpty;  override def keySet : Set[K] = new KeySet;  override final def keys = keySet.elements;  /** The values of this map as a projection, which means      removals from the returned collection will remove the element from this map.      @returns a projection of this map's elements.  */  def valueSet : MutableIterable.Projection[E] = projection.map(_._2);    override def put(key : K, elem : E) : Option[E] = throw new java.lang.AbstractMethodError     override def ++=(that : Iterable[(K,E)]) : Unit =     that.foreach(p => put(p._1, p._2));    override def removeKey(key : K) : Option[E] = {    val i = elements;    while (!i.hasNext) {      val result = i.next;      if (result._1 == key) {        i.remove;         return Some(result._2);      }    }    return None;  }  override def has(pair : Tuple2[K,E]) = get(pair._1) match {  case Some(e) if e == pair._2 => true;  case _ => false;  }  override def get(key : K) = elements.find(p => p._1 == key).map(_._2);  override def update(key : K, e : E) : Unit = put(key,e);  override def +(pair : Tuple2[K,E]) : this.type = {    put(pair._1,pair._2); this;  }  override def +=(pair : Tuple2[K,E]) : Unit = put(pair._1, pair._2);  override def -(key : K) : this.type = {    removeKey(key); this;  }  override def remove(p : (K,E)) = get(p._1) match {  case Some(p._2) => this -= p._1; true  case _ => false;  }    override def -=(key : K) : Unit = removeKey(key);  override def elements : MutableIterator[Tuple2[K,E]];    override def projection : Map.Projection[K,E] = new Map.Projection[K,E] {    override def elements = Map.this.elements    override def size = Map.this.size    override def get(k : K) = Map.this.get(k)    override def put(k : K, e : E) = Map.this.put(k, e)  }  /**   */  def lense[F](f : E => F, g : F => E) : jcl.Map.Projection[K,F] = new Lense[F](f,g);    protected class Lense[F](f : E => F, g : F => E) extends jcl.Map.Projection[K,F] {    override def elements = Map.this.elements.map(k => Tuple2(k._1, f(k._2)));    override def removeKey(key : K) = Map.this.removeKey(key).map(f);    override def put(key : K, elem : F) = Map.this.put(key, g(elem)).map(f);    override def get(key : K) = Map.this.get(key).map(f);    override def lense[G](f0 : F => G, g0 : G => F) : jcl.Map.Projection[K,G] =       Map.this.lense[G](x => f0(f(x)), y => g(g0(y)));    override def size = size0;  }  protected class KeySet extends Set[K] {    override def size = Map.this.size;    override def add(k : K) = Map.this.put(k, default(k)) == None;    override def elements = Map.this.elements.map(_._1);    override def has(k : K) = Map.this.contains(k);  }  override def filterKeys(p : K => Boolean) : Map.Projection[K,E] = new Filter(p);   protected class Filter(p : K => Boolean) extends Map.Projection[K,E] {    override def elements = {      val i = Map.this.elements.filter(e => p(e._1));      new MutableIterator[(K,E)] {        def next = i.next        def hasNext = i.hasNext        def remove : Unit = throw new NoSuchMethodException      }    }    override def removeKey(key : K) = {      if (!p(key)) throw new IllegalArgumentException;      Map.this.removeKey(key);    }    override def contains(key : K) = p(key) && Map.this.contains(key);    override def put(key : K, elem : E) = {      if (!p(key)) throw new IllegalArgumentException;      Map.this.put(key, elem);    }    override def get(key : K) = {      if (!p(key)) None;      else Map.this.get(key);    }    override def filterKeys(p0 : K => Boolean) : Map.Projection[K,E] =      Map.this.filterKeys(e => p(e) && p0(e));    override def size = size0;  }}object Map {  trait MutableIterableProjection[A] extends MutableIterable.Projection[A];  trait Projection[K,E] extends MutableIterableProjection[(K,E)] with scala.collection.Map.Projection[K,E] with Map[K,E] {    override def projection = this    override def map[B](f : ((K,E)) => B) : MutableIterable.Projection[B] = super[MutableIterableProjection].map(f);  }  def apply[T,E](map0 : java.util.Map[T,E]) = new MapWrapper[T,E] {    val underlying = map0  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?