再谈Scala集合
2017-12-14 14:01
218 查看
集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再梳理一下。 本文原文出处: 本文原文链接: http://blog.csdn.net/bluishglc/article/details/78801913 转载请注明出处。
点击查看大图
上述是使用的是一些抽象集合的Trait去构建实例,每一个抽象的Trait在实例化时都有一个对应的具体类被创建出来。
对于具体集合类,你更可以使用上述方法来创建实例了:
关于
添加:
映射操作:
转换操作:
复制操作:
判定集合大小:
获取元素操作:
获取子集操作:
细分操作:
测试元素:
折叠操作:
特殊的折叠操作:
字符串操作:
关于
关于
如果你是从Java刚刚转到Scala, 那么要记住Scala里的List和Java中的List一点也不像!Java中的List,比如ArrayList是一个可变的数组,Scala中的List是一个不可变的链表. 所以后者更适合
关于
Scala中的Array是一个可变的,具有索引的集合,但是它有一个特点,即:一但它的大小被设定,它就无法再改变,这看上去是一个标准的数据结构中的静态数组。
虽然Array经常被用于Scala中的各种示例代码,但是自2.10.x之后,真正被推荐使用的是:
集合“族谱”
还是先上张图吧,这是我找到的最好的一个关于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)
关于Traversable
Traversable是整个类体系中的顶层父类,它有一个抽象方法:
def foreach[U](f: Elem => U)
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,
/:,
:\,
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
和Vector
Scala中的Array是一个可变的,具有索引的集合,但是它有一个特点,即:一但它的大小被设定,它就无法再改变,这看上去是一个标准的数据结构中的静态数组。虽然Array经常被用于Scala中的各种示例代码,但是自2.10.x之后,真正被推荐使用的是:
Vector: 不可变的Array
ArrayBuffer: 可变类的Array
相关文章推荐
- Scala集合与Spark解析
- scala--Scala 强大的集合数据操作示例
- Scala--集合
- 第十章 Scala 容器基础(二十):使用reduce和fold方法遍历集合的所有元素
- 第十章 Scala 容器基础(二十八):集合排序
- scala List集合的用法
- Scala学习笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- scala中的集合与集合操作
- Scala学习笔记5 (集合 Collections)
- Scala中的数组、映射、元组、集合
- Scala语言之数据集合(5)
- scala 开发入门(3)-- 集合
- scala集合API使用
- 云星数据---Scala实战系列(精品版)】:Scala入门教程042-Scala实战源码-Scala 集合List
- Scala讲座:混入多重继承、类型层次和集合
- Scala——集合
- Scala学习笔记5 (集合 Collections)
- scala集合List和Set
- Scala集合
- Scala基础教程(六):字符串、数组、集合