跳转到内容

学习 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 的对象。

华夏公益教科书