A menudo me encuentro usando una lista perezosa cuando quiero un vector, y viceversa. Además, a veces tengo un vector de mapas, cuando realmente quería un conjunto de mapas. ¿Hay alguna función auxiliar que me ayude a convertir entre estos tipos?
No olvidemos que trusty old le intopermite tomar cualquier cosa que seqpueda (lista, vector, mapa, conjunto, mapa ordenado) y un contenedor vacío que desee llenar, y lo coloca 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"intoes un envoltorio conj, que es la abstracción básica para insertar nuevas entradas de manera adecuada en una colección según el tipo de colección. El principio que hace que esto fluya tan bien es que Clojure se basa en abstracciones componibles , en este caso intosobre la conjcolección y seq.
Los ejemplos anteriores aún se compondrían bien si el destinatario se pasara en tiempo de ejecución: porque las abstracciones subyacentes ( seqy conj) se implementan para todas las colecciones (y muchas de las colecciones de Java también), por lo que las abstracciones más altas no necesitan preocuparse. sobre muchos casos especiales relacionados con los datos.
intousosconj, el hacer(into '() some-seq)producirán una lista que es la inversa de some-seq, porque seconjconvierte en listas.intoutiliza transitorios (para la mayoría de los tipos de secuencia) para obtener mejores características de rendimiento que la mayoría de los otros medios de conversión.vecsety , en general,intoson tus amigos para "convertir" fácilmente a otro tipo de colección.¿Cómo quiere transformar un vector de mapas en un mapa de mapas? Necesita una clave, ¿puede proporcionar uso con entrada de muestra / salida esperada?
fuente
Para los vectores existe la
vecfunciónPara las secuencias perezosas existe la
lazy-seqfunciónPara convertir en conjuntos, existe la
setfunciónfuente
lazy-seqlugar deseqsimplemente agrega una indirección inútil. Si realmente desea devolver algo que no sea nulo, incluso antes de que exista una colección vacíasequence.lazy-seqes algo así como una construcción de bajo nivel.Una respuesta más para convertir de una lista a un mapa (en aras de la integridad), desde aquí :
fuente
Para convertir un vector en una lista también puede usar
for, así:Cuando no desee manipular los datos, simplemente use
seqen el vector:fuente
forhacerlo, simplemente podría hacerlo(map identity [1 2 3 4])No es necesario convertir un vector en una lista. Clojure tratará un vector como trataría una lista, como una secuencia, cuando se requiera una secuencia. Por ejemplo,
Si necesita asegurarse de que el vector se esté tratando como una secuencia, envuélvalo en
seq:Si tiene un vector de mapas y desea un conjunto de mapas, no importa que el vector contenga mapas. Simplemente convierta el vector en un conjunto como de costumbre:
fuente