map.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 275 行
SCALA
275 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2003-2008, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id: Map.scala 14115 2008-02-22 17:42:43Z michelou $package scala.collection.mutableimport Predef._/** The canonical factory methods for <a href="Map.html">mutable maps</a>. * These currently return <a href="HashMap.html">HashMap's</a>. */object Map { /** The empty map of this type; this is implemented as a hashtable */ def empty[A, B]: Map[A, B] = new HashMap[A, B] /** The canonical factory for this type */ def apply[A, B](elems: (A, B)*) = empty[A, B] ++ elems}/** This trait represents mutable maps. Concrete map implementations * just have to provide functionality for the abstract methods in * <code>scala.collection.Map</code> as well as for <code>update</code>, * and <code>-=</code>. * * @author Matthias Zenger * @author Martin Odersky * @version 2.0, 31/12/2006 */@cloneabletrait Map[A, B] extends AnyRef with collection.Map[A, B] with Scriptable[Message[(A, B)]] with CloneableCollection{ /** This method allows one to add a new mapping from <code>key</code> * to <code>value</code> to the map. If the map already contains a * mapping for <code>key</code>, it will be overridden by this * function. * * @param key The key to update * @param value The new value */ def update(key: A, value: B) /** Add a key/value pair to this map. * @param kv the key/value pair. */ def += (kv: (A, B)) { update(kv._1, kv._2) } /** Add two or more key/value pairs to this map. * @param kv1 the first key/value pair. * @param kv2 the second key/value pair. * @param kvs the remaining key/value pairs. */ def += (kv1: (A, B), kv2: (A, B), kvs: (A, B)*) { this += kv1; this += kv2; this ++= kvs } /** Add a sequence of key/value pairs to this map. * @param kvs the iterable object containing all key/value pairs. */ def ++= (kvs: Iterable[(A, B)]) { this ++= kvs.elements } /** Add a sequence of key/value pairs to this map. * @param kvs the iterator containing all key/value pairs. */ def ++= (kvs: Iterator[(A, B)]) { kvs foreach += } /** Add a key/value pair to this map. * @param kv the key/value pair. * @return The map itself with the new binding added in place. */ def + (kv: (A, B)): Map[A, B] = { this += kv; this } /** Add two or more key/value pairs to this map. * @param kv1 the first key/value pair. * @param kv2 the second key/value pair. * @param kvs the remaining key/value pairs. * @return The map itself with the new bindings added in place. */ def + (kv1: (A, B), kv2: (A, B), kvs: (A, B)*): Map[A, B] = { this.+=(kv1, kv2, kvs: _*); this } /** Add a sequence of key/value pairs to this map. * @param kvs the iterable object containing all key/value pairs. * @return The itself map with the new bindings added in place. */ def ++ (kvs: Iterable[(A, B)]): Map[A, B] = { this ++= kvs; this } /** Add a sequence of key/value pairs to this map. * @param kvs the iterator containing all key/value pairs. * @return The itself map with the new bindings added in place. */ def ++ (kvs: Iterator[(A, B)]): Map[A, B] = { this ++= kvs; this } /** Remove a key from this map, noop if key is not present. * @param key the key to be removed */ def -= (key: A) /** Remove two or more keys from this map * @param key1 the first key to be removed * @param key2 the second key to be removed * @param keys the remaining keys to be removed */ def -= (key1: A, key2: A, keys: A*) { this -= key1; this -= key2; this --= keys } /** Remove a sequence of keys from this map * @param keys the keys to be removed */ def --= (keys: Iterable[A]) { this --= keys.elements } /** Remove a sequence of keys from this map * @param keys the keys to be removed */ def --= (keys: Iterator[A]) { keys foreach -= } /** Remove a key from this map * @param key the key to be removed * @return The map itself with the binding for <code>key</code> removed if * it existed. */ def - (key: A): Map[A, B] = { this -= key; this } /** Remove <code>key</code> from this map and return the element * that the key was previously mapped to (if any). */ def removeKey(key: A): Option[B] = { val ret = get(key) this -= key ret } /** Map <code>key</code> to <code>elem</code> in this map and return the element * that the key was previously mapped to (if any). */ def put(key: A, elem: B): Option[B] = { val ret = get(key) this(key) = elem ret } /** Remove two or more keys from this map * @param key1 the first key to be removed * @param key2 the second key to be removed * @param keys the remaining keys to be removed * @return The map itself with all bindings for the given keys removed. */ def - (key1: A, key2: A, keys: A*): Map[A, B] = { this.-=(key1, key2, keys: _*); this } /** Remove a sequence of keys from this map * @param keys the keys to be removed * @return The map itself with all bindings for <code>keys</code> removed. */ def -- (keys: Iterable[A]): Map[A, B] = { this --= keys; this } /** Remove a sequence of keys from this map * @param keys the keys to be removed * @return The map itself with all bindings for <code>keys</code> removed. */ def -- (keys: Iterator[A]): Map[A, B] = { this --= keys; this } /** Removes all mappings from the map. After this operation is * completed, the map is empty. */ def clear() { keys foreach -= } /** Check if this map maps <code>key</code> to a value. * Return that value if it exists, otherwise put <code>default</code> * as that key's value and return it. */ def getOrElseUpdate(key: A, default: => B): B = get(key) match { case Some(v) => v case None => val d = default; this(key) = d; d } /** This function transforms all the values of mappings contained * in this map with function <code>f</code>. * * @param f The transformation to apply */ def transform(f: (A, B) => B) { elements foreach { case (key, value) => update(key, f(key, value)) } } /** This method retains only those mappings for which the predicate * <code>p</code> returns <code>true</code>. * * @param p The test predicate * @deprecated cannot be type inferred because if retain in Iterable. */ def retain(p: (A, B) => Boolean) { toList foreach { case (key, value) => if (!p(key, value)) -=(key) } } /** Send a message to this scriptable object. * * @param cmd the message to send. */ def <<(cmd: Message[(A, B)]): Unit = cmd match { case Include((k, v)) => update(k, v) case Update((k, v)) => update(k, v) case Remove((k, _)) => this -= k case Reset() => clear case s: Script[_] => s.elements foreach << case _ => throw new UnsupportedOperationException("message " + cmd + " not understood") } /** Return a clone of this map. * * @return a map with the same elements. */ override def clone(): Map[A, B] = super.clone().asInstanceOf[Map[A, B]] /** Return a read-only projection of this map */ def readOnly: scala.collection.Map[A, B] = new scala.collection.Map[A, B] { override def toString = "ro-" + Map.this.toString override def size = Map.this.size override def elements = Map.this.elements override def get(key: A) = Map.this.get(key) } /** This method defines syntactic sugar for adding or modifying * mappings. It is typically used in the following way: * <pre> * map += key -> value * </pre> * @deprecated use <code>+= Pair(key, value)</code> */ @deprecated def +=(key: A): MapTo = new MapTo(key) /** <code>incl</code> can be used to add many mappings at the same time * to the map. The method assumes that a mapping is represented * by a <code>Pair</code> object who's first component denotes the * key, and who's second component refers to the value. * * @param mappings * @deprecated use <code>+=</code> */ @deprecated def incl(mappings: (A, B)*) { this ++= mappings.elements } /** This method will remove all the mappings for the given sequence * of keys from the map. * * @param keys * @deprecated use <code>-=</code> */ @deprecated def excl(keys: A*) { this --= keys.elements } @deprecated class MapTo(key: A) { def ->(value: B) { update(key, value) } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?