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静态方法体中的某些“adoopt”技巧感到困惑,并认为有一些内部有用的性能技巧。
...