请在 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(除非将其用作高阶函数,否则很少会用到)。

vecset的实现与使用into时获得的结果类似(对元素进行归约到临时集合),因此我预计性能将是类似的。vecset更易于输入,但into可以接受转换器,这是权衡。

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

是我的错 - 已修复

"我预计性能将类似"
明白了!谢谢

查看了 vec 函数实现,我在 create 静态方法的主体中遇到了一些“adapt”技巧,并假设了一些内部有用的性能技巧。
...