在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" 

intoconj一个包装,它是基于集合的types将新条目适当地插入集合的基本抽象。 这个stream程非常好的原理是Clojure基于可组合的抽象 ,在这种情况下,在集合和seq之上的连接之上。

如果接收者在运行时被传入,上面的例子仍然是很好的组合:因为底层抽象( seqconj )是针对所有集合(也是Java的许多集合)实现的,所以更高的抽象并不需要担心很多特殊数据相关的angular落案例。

vecset并一般into你的朋友,轻松“转换”为另一种集合types。

你想如何将地图的vector变换成地图的地图? 你需要一个密钥,你能提供样本input/预期输出吗?

对于向量有vec函数

 user=> (vec '(1 2 3)) [1 2 3] 

对于懒序列,有lazy-seq函数

 user=> (lazy-seq [1 2 3]) (1 2 3) 

为了转换成集,有setfunction

 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}}