当我想要一个向量时,我经常发现自己使用了一个懒惰列表,反之亦然。另外,有时候,当我真的想要一组地图时,会有一个向量地图。是否有任何辅助函数可以帮助我在这些类型之间进行转换?
当我想要一个向量时,我经常发现自己使用了一个懒惰列表,反之亦然。另外,有时候,当我真的想要一组地图时,会有一个向量地图。是否有任何辅助函数可以帮助我在这些类型之间进行转换?
Answers:
别忘了,值得信赖的旧版into
可以让您拿走所有seq
能够填充的东西(列表,向量,地图,集合,排序地图)和要填充的空容器into
。
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
是的包装conj
,这是用于根据集合的类型将新条目适当地插入到集合中的基础抽象。使流程顺畅的原理是Clojure建立在可组合的抽象上,在这种情况下into
是conj
在collection和seq
。
如果在运行时传递接收者,上述示例仍然可以很好地构成:因为为所有集合(也包括许多Java的集合)实现了基础抽象(seq
和conj
),因此不需要担心更高的抽象关于许多与数据相关的特殊情况
into
使用conj
,这样做(into '() some-seq)
将产生一个列表这就是反向一些-seq的,因为conj
conses之外到列表。
into
与大多数其他转换方式相比,利用瞬变(对于大多数seq类型)具有更好的性能特征。
vec
,set
并且通常into
是您的朋友,可以轻松地将其“转换”为其他收藏集类型。
您想如何将地图矢量转换为地图地图?您需要一个键,可以提供示例输入/预期输出的使用吗?
无需将向量转换为列表。当需要序列时,Clojure会像对待列表一样将向量视为序列。例如,
user=> (cons 0 [1 2 3])
(0 1 2 3)
如果需要确保将向量视为序列,请将其包装在seq
:
user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]
user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)
如果您有地图矢量,并且想要一组地图,则矢量拥有地图也没关系。您只需照常将向量转换为集合即可:
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}