当前位置:K88软件开发文章中心编程语言SQLscala → 文章内容

更多的集合

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-19 4:45:32

由 Shaodengdeng 创建, 最后一次修改 2016-08-12 更多的集合Scala 提供了一套很好的集合实现,提供了一些集合类型的抽象。这让你的代码可以与 Foo 的集合交互,而无需担心该集合是是一个 List,还是 Set,或是任何你有的类型。这里提供了一个很好的页面来查看各种集合的默认实现,并链接到他们的 scala 在线文档。基础知识表 List标准的链表。scala> List(1, 2, 3)res0: List[Int] = List(1, 2, 3)你可以用函数式语言的方式连接它们。scala> 1 :: 2 :: 3 :: Nilres1: List[Int] = List(1, 2, 3)参考 API文档集 Set集没有重复scala> Set(1, 1, 2)res2: scala.collection.immutable.Set[Int] = Set(1, 2)参考 API文档序列 Seq序列有一个给定的顺序。scala> Seq(1, 1, 2)res3: Seq[Int] = List(1, 1, 2)(请注意返回的是一个列表。因为 Seq 是一个特质;而列表是序列的很好实现。如你所见,Seq 也是一个工厂单例对象,可以用来创建列表。)参考 API文档映射 Map映射是键值容器。scala> Map('a' -> 1, 'b' -> 2)res4: scala.collection.immutable.Map[Char,Int] = Map((a,1), (b,2))参考 API文档层次结构下面介绍的都是特质,它们在可变的(mutable)和不可变的(immutable)的包中都有特定实现。Traversable所有集合都可以被遍历。这个特质定义了标准函数组合子。 这些组合子根据 foreach 来写,所有集合必须实现。参考 API文档Iterableiterator() 方法返回一个 Iterator 来迭代元素。参考 API文档Seq 序列有顺序的对象序列。参考 API文档Set 集没有重复的对象集合。参考 API文档Map键值对。参考 API文档方法Traversable下面所有方法在子类中都是可用的。参数和返回值的类型可能会因为子类的覆盖而看起来不同。def head : Adef tail : Traversable[A]这里是函数组合子定义的地方。def map [B] (f: (A) => B) : CC[B]返回每个元素都被 f 转化的集合def foreach[U](f: Elem => U): Unit在集合中的每个元素上执行 f 。def find (p: (A) => Boolean) : Option[A]返回匹配谓词函数的第一个元素def filter (p: (A) => Boolean) : Traversable[A]返回所有匹配谓词函数的元素集合划分:def partition (p: (A) ? Boolean) : (Traversable[A], Traversable[A])按照谓词函数把一个集合分割成两部分def groupBy [K] (f: (A) => K) : Map[K, Traversable[A]]转换:有趣的是,你可以转换集合类型。def toArray : Array[A]def toArray [B >: A] (implicit arg0: ClassManifest[B]) : Array[B]def toBuffer [B >: A] : Buffer[B]def toIndexedSeq [B >: A] : IndexedSeq[B]def toIterable : Iterable[A]def toIterator : Iterator[A]def toList : List[A]def toMap [T, U] (implicit ev: <:<[A, (T, U)]) : Map[T, U]def toSeq : Seq[A]def toSet [B >: A] : Set[B]def toStream : Stream[A]def toString () : Stringdef toTraversable : Traversable[A]把映射转换为一个数组,您会得到一个键值对的数组。scala> Map(1 -> 2).toArrayres41: Array[(Int, Int)] = Array((1,2))Iterable添加一个迭代器的访问。 def iterator: Iterator[A]一个迭代器能给你提供什么?def hasNext(): Booleandef next(): A这是非常 Java 式的。你通常不会看到在 Scala 中使用迭代器,通常更容易出现的是函数组合器或 for 循环的使用。Set def contains(key: A): Boolean def +(elem: A): Set[A] def -(elem: A): Set[A]Map通过键查找的键值对的序列。可以像这样将一个键值对列表传入 apply()scala> Map("a" -> 1, "b" -> 2)res0: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,1), (b,2))或者像这样:scala> Map(("a", 2), ("b", 2))res0: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,2), (b,2))题外话什么是->?这不是特殊的语法,这是一个返回元组的方法。scala> "a" -> 2res0: (java.lang.String, Int) = (a,2)请记住,这仅仅是下面代码的语法糖scala> "a".->(2)res1: (java.lang.String, Int) = (a,2)您也可以使用++操作符构建scala> Map.empty ++ List(("a", 1), ("b", 2), ("c", 3))res0: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,1), (b,2), (c,3))常用的子类HashSet 和 HashMap 的快速查找,这些集合的最常用的形式。 HashSet API, HashMap APITreeMap 是 SortedMap 的一个子类,它可以让你进行有序访问。 [TreeMap API]()Vector 快速随机选择和快速更新。 Vector APIscala> IndexedSeq(1, 2, 3)res0: IndexedSeq[Int] = Vector(1, 2, 3)Range 等间隔的 Int 有序序列。你经常会在 for 循环看到。 Range APIscala> for (i <- 1 to 3) { println(i) }123Ranges 支持标准的函数组合子。scala> (1 to 3).map { i => i }res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3)默认实现使用特质的 apply 方法会给你默认实现的实例,例如,Iterable(1, 2)会返回一个列表作为其默认实现。scala> Iterable(1, 2)res0: Iterable[Int] = List(1, 2)序列 Seq 也是一样的,正如我们前面所看到的scala> Seq(1, 2)res3: Seq[Int] = List(1, 2)scala> Iterable(1, 2)res1: Iterable[Int] = List(1, 2)scala> Sequence(1, 2)warning: there were deprecation warnings; re-run with -deprecation for detailsres2: Seq[Int] = List(1, 2)Setscala> Set(1, 2)res31: scala.collection.immutable.Set[Int] = Set(1, 2)一些描述性的特质IndexedSeq 快速随机访问元素和一个快速的长度操作。"API 文档":http://www.scala-lang.org/api/current/scala/collection/IndexedSeq.htmlLinearSeq 通过 head 快速访问第一个元素,也有一个快速的 tail 操作。 API 文档可变 vs 不可变不可变优点在多线程中不会改变缺点一点也不能改变Scala 允许我们是务实的,它鼓励不变性,但不惩罚我们需要的可变性。这和 var vs. val 非常相似。我们总是先从 val 开始并在必要时回退为 var。我们赞成使用不可改变的版本的集合,但如果性能使然,也可以切换到可变的。使用不可变集合意味着你在多线程不会意外地改变事物。可变集合前面讨论的所有类都是不可变的。让我们来讨论常用的可变集合。HashMap

[1] [2]  下一页


更多的集合