再谈Scala集合

时间:2021-09-05 15:47:58

  集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下。 本文原文出处: 
  还是先上张图吧,这是我找到的最好的一个关于Scala集合的图了,出自:http://lkumarjain.blogspot.co.id/2015/01/scala-collection-framework.html :
  
  一致的构建风格
  
  在Scala里我们使用一致的简洁的语法实例化一个集合,不管你使用的是一个Trait还是一个具体类,你都可以像这样去实力化:
  
  Traversable(1, 2, 3)
  
  Iterable("x", "y", "z")
  
  Map("x" -> 24, "y" -> 25, "z" -> 26)
  
  Set(Color.red, Color.green, Color.blue)
  
  SortedSet("hello", "world")
  
  Buffer(x, y, z)
  
  IndexedSeq(1.0, 2.0)
  
  LinearSeq(a, b, c)

  
  上述是使用的是一些抽象集合的Trait去构建实例,每一个抽象的Trait在实例化时都有一个对应的具体类被创建出来。
  
  对于具体集合类,你更可以使用上述方法来创建实例了:
  
  List(1, 2, 3)
  
  HashMap("x" -> 24, "y" -> 25, "z" -> 26)
  
  1
  
  2
  
  关于Traversable
  
  Traversable是整个类体系中的顶层父类,它有一个抽象方法:
  
  def foreach[U](f: Elem => U)
  
  1
  
  Traversable还提供了一系列的具体方法,它们分为以下几个类别:
  
  添加: ++, 把两个traversable加在一起,返回的是一个新的traversable
  
  映射操作: map, flatMap, and collect
  
  转换操作: toArray, toList, toIterable, toSeq, toIndexedSeq, toStream, toSet, toMap,
  
  复制操作: copyToBufferand copyToArray
  
  判定集合大小: isEmpty, nonEmpty, size, and hasDefiniteSize
  
  获取元素操作: head, last, headOption, lastOption, find
  
  获取子集操作: tail, init, slice, take, drop, takeWhile, dropWhile, filter, filterNot, withFilter
  
  细分操作: splitAt, span, partition, groupBy
  
  测试元素: exists, forall, count
  
  折叠操作: foldLeft, foldRight, /www.xyyulept.com:, :\, reduceLeft, reduceRight
  
  特殊的折叠操作: sum, product, min, max
  
  字符串操作: mkString, addString, stringPrefix
  
  关于Seq
  
  Seq有两个字的特质,LinearSeq和IndexedSeq, 它们都没有添加新的方法,但是它们提供了不同的性能特征:LinearSeq有很高效的head和tail操作,而IndexedSeq在计算长度和更新方面性能更好,这些是都是很基本的,实际上就是链表和数组之间的区别。
  
  关于List
  
  如果你是从Java刚刚转到Scala, 那么要记住Scala里的List和Java中的List一点也不像!Java中的List,比如ArrayList是一个可变的数组,Scala中的List是一个不可变的链表. 所以后者更适合head,tail,isEmpty方法,所以List很适合递归操作,这在Scala中非常常见。
  
  关于Array,ArrayBuffer和www.chushiyl.cn Vector
  
  Scala中的Array是一个可变的,具有索引的集合,但是它有一个特点,即:一但它的大小被设定,它就无法再改变,这看上去是一个标准的数据机构中的静态数组。
  
  虽然Array经常被用于Scala中的各种示例代码,但是自2.10.x之后,真正应该被广泛使用的是:
  
  Vector: www.ccyl178.com/ 不可变的Array
  
  ArrayBuffer: 可变类的Array