在Clojure中有一个简单的方法来转换列表types?
当我想要一个vector时,我经常发现自己使用了一个懒惰列表,反之亦然。 另外,有时我有一个地图vector,当我真的想要一套地图。 有帮助function来帮助我在这些types之间进行转换吗?
让我们不要忘记,可信任的老into
你让任何东西seq
able(列表,vector,地图,集合,sorting映射)和一个空的容器,你想填充,并把它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
一个包装,它是基于集合的types将新条目适当地插入集合的基本抽象。 这个stream程非常好的原理是Clojure基于可组合的抽象 ,在这种情况下,在集合和seq
之上的连接之上。
如果接收者在运行时被传入,上面的例子仍然是很好的组合:因为底层抽象( seq
和conj
)是针对所有集合(也是Java的许多集合)实现的,所以更高的抽象并不需要担心很多特殊数据相关的angular落案例。
vec
, set
并一般into
你的朋友,轻松“转换”为另一种集合types。
你想如何将地图的vector变换成地图的地图? 你需要一个密钥,你能提供样本input/预期输出吗?
对于向量有vec
函数
user=> (vec '(1 2 3)) [1 2 3]
对于懒序列,有lazy-seq
函数
user=> (lazy-seq [1 2 3]) (1 2 3)
为了转换成集,有set
function
user=> (set [{:a :b, :c :d} {:a :b} {:a :b}]) #{{:a :b} {:a :b, :c :d}}
还有一个从列表转换为地图的答案(为了完整性) – 从这里开始 :
(apply hash-map '(1 2 3 4)) ;=>{1 2, 3 4}
要将一个向量转换为一个列表,你也可以像下面这样使用:
=> (for [i [1 2 3 4]] i) (1 2 3 4)
当你不想操纵数据时,只需在向量上使用seq
:
=> (seq [1 2 3]) (1 2 3)
没有必要将vector转换为列表。 Clojure将把一个向量视为一个序列,当它需要一个序列时,它将把列表当作序列来处理。 例如,
user=> (cons 0 [1 2 3]) (0 1 2 3)
如果您需要确保将vector视为序列,请将其封装在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)
如果你有一个地图的vector,并且你想要一组地图,vector保存地图并不重要。 你只是像往常一样将vector转换为一个集合:
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}]) #{{:a 1, :b 2} {"four" 4, "three" 3}}