2024 年 Clojure 调查问卷 中分享您的想法!

欢迎!请查看 关于 页面以获取更多关于如何使用本站的信息。

+3
集合
编辑

我可以通过两种方式创建集合/映射/向量

(into #{} xs) ;; creates PersistentHashSet
(set xs)      ;; creates PersistentHashSet

(into {} xs)  ;; creates PersistentArrayMap or PersistentHashMap (depends on xs size) 
(apply hash-map xs) ;; creates PersistentHashMap

(into [] xs)  ;; creates PersistentVector
(vec xs)      ;; creates PersistentVector

(into r xs)
- 通过 conj! 将输入序列逐个添加到传递的结果集合(使用 transient/persistent 技巧)定义一个通用的算法

(ctor xs)
- 精确地定义结果数据结构的类型
- 将 xs 序列作为构造函数(静态 java 函数)的参数传递,所以每个构造函数都可以定义其自己的创建逻辑(可能不是逐个 conj 输入序列)

这两种方式之间是否有性能差异?
可能有一个已建立的语法定义何时使用?

谢谢!

1 答案

+2

已选择
 
最佳答案

这并不完全正确,因为 hash-map 不接受 xs,它接受单个键值元素,例如 (hash-map :a 1 :b 2)(into {} [[:a 1] [:b 2]]) 相比。对于这一点,你手中的将驱动它。如果你有一系列成对的数据,那么请使用 into。如果你正在构建一个字面量映射,最好使用 {...} 创建一个字面量映射而不是 hash-map(除非作为高阶函数使用,否则你很少会用到它)。

vec 和 set 的实现类似于你使用 into 得到的结果(对元素的递减到临时集合),因此我预计性能将相似。vec 和 set 较短,但 into 可以使用转置器,这是权衡。

"这并不完全正确,因为 hash-map 不接受 xs,它接受单个键值元素,例如 (hash-map :a 1 :b 2) 与 (into {} [[:a 1] [:b 2]]) 相比。"

不好意思,改正了。

"我预计性能会相似"
明白了!谢谢

查看 vec 函数实现,我在 create 静态方法体中的某些“收养”技巧上感到困惑,并猜测了一些内部的性能技巧。
...