学习 Clojure/集合函数
外观
clojure 命名空间包含许多用于处理集合的函数和宏。我不会重复 API 文档中的参考信息,只给出一些示例操作。
- (count collection)
返回集合中的项目数量。
(count [a b c]) ; return 3 (count nil) ; return 0
- (conj collection item)
连接。返回一个新的集合副本,其中添加了项目。项目的添加方式取决于集合类型,例如,连接到列表的项目添加到开头,而连接到向量的项目添加到末尾。
(conj [5 7 3] 9) ; returns [5 7 3 9] (conj (list 5 7 3) 9)) ; returns list (9 5 7 3) (conj nil item) ; returns list (item)
- (list item*)
- (vector item*)
- (hash-map keyval*) 其中 keyval => key value
分别生成列表、向量或哈希图。通常你总是可以使用字面语法来代替这些函数,但是拥有函数可以让我们传递给期望函数参数的其他函数。
- (nth collection n)
返回collection中的第n个项目,其中 collection 是任何集合但不是映射。(集合可以是映射上的序列,但不是实际的映射。)
(nth [31 73 -11] 2) ; returns -11 (nth (list 31 73 -11) 0) ; returns 31 (nth [8 4 4 1] 9) ; exception: out of bounds
- 关键字作为函数
关键字可以用作函数来查找各种映射(哈希图、集合、结构映射等)中键的值。
(:velcro {:velcro 5 :zipper 7}) ; returns 5, the value mapped to :velcro in the hashmap
- 映射作为函数
映射类型本身可以用作函数来查找其键的值。
({:velcro 5 :zipper 7} :velcro) ; returns 5, the value mapped to :velcro in the hashmap ({3 "cat" :tim "moose"} :tim) ; returns "moose", the value mapped to :tim in the hashmap (["hi" "bye"] 1) ; returns "bye", the value of the second index in the vector
大多数序列函数可以传递不是序列但可以从中派生序列的对象,例如,可以传递列表代替序列。
在序列操作和专门针对特定集合类型操作之间存在冗余的情况下,冗余主要出于性能考虑。例如,要生成向量的反向顺序序列,可以使用序列操作reverse或特定于向量的rseq:虽然rseq的通用性较低,但效率更高。
- (seq collection)
返回表示集合的序列。seq也适用于原生 Java 数组、字符串,以及任何实现了 Iterable、Iterator 或 Enumeration 的对象。