Programming Clojure学习笔记——使用序列统一数据

seq是一种逻辑列表。可以通过序列来访问的集合被称为可序列

4.1 一切皆序列
每一个聚集数据结构都可以看作序列,序列有三个核心操作:
1. 取序列的第一个元素:
(first aseq)
如果参数为空或nil则返回nil
2. 取第一个元素后的所有元素:
(rest aseq)
如果没有,则返回空,而不是nil
3.在序列的头部添加一个元素构成一个新的序列
(cons elem aseq)

seq函数将可序列集合转换成序列:
(seq coll)
如果集合coll为空或nil,则返回nil

next函数返回第一个元素后所有元素组成的序列
(next aseq)
等价于(seq (rest aseq))

注意:序列函数返回结果始终是序列,不管输入是什么类型

map可以看作序列,每个键值对就是序列的一个元素:
(first {:fname "Stu" :lname "Halloway"})
返回[:fname "Stu"]

set也可以看作序列:
(first #{:the :quick :brown :fox})
返回[:brown]

Map和set中元素有一个稳定的顺序,该顺序依赖具体的实现(Clojure内部实现),后放进的元素不一定放在后面,因此我们不能依赖该顺序。如果想要一个可信赖的顺序,可以使用sorted-set和sorted-map,sorted-set按字符顺序排列,sorted-set依据key值按字符顺序排列,如:
set排序
user=> (sorted-set :the :quick :brown :fox)
#{:brown :fox :quick :the}

map排序
user=> (sorted-map :c 3 :b 2 :a 1)
{:a 1, :b 2, :c 3}

seq的另外两个核心操作:
(1) conj
(conj coll element & elements)
conj添加一个或多个元素到集合

(2) into
(into to-coll form-coll)
into添加一个集合中所有元素到另一个集合

注意:
(a) 对于list,conj和into在头部添加;而不于向量,则在末尾添加
user=> (conj '(1 2 3) :a)
(:a 1 2 3)
user=> (conj [1 2 3] :a)
[1 2 3 :a]

(b) conj和into不改变输入类型,即输入什么类型,返回什么类型
user=> (class (conj (seq '(1 2 3)) :a))
clojure.lang.PersistentList

序列是不可变的

你可能感兴趣的:(数据结构,list,user,REST,Class,clojure)