Não vamos esquecer que o trusty old into
permite que você pegue qualquer coisa seq
capaz (lista, vetor, mapa, conjunto, mapa classificado) e um recipiente vazio que você deseja preencher e coloque- into
o.
(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
é um invólucro conj
, que é a abstração base para inserir novas entradas apropriadamente em uma coleção com base no tipo da coleção. O princípio que faz com que esse fluxo tão bem é que Clojure é construir em abstrações componíveis , neste caso into
em cima conj
no topo da coleta e seq
.
Os exemplos acima ainda funcionariam bem se o destinatário estivesse sendo passado em tempo de execução: porque as abstrações subjacentes ( seq
e conj
) são implementadas para todas as coleções (e muitas das coleções de Java também), então as abstrações superiores não precisam se preocupar sobre muitos casos especiais relacionados a dados.
into
usaconj
, fazer(into '() some-seq)
gerará uma lista que é o reverso de some-seq, porqueconj
conses em listas.into
utiliza transientes (para a maioria dos tipos de seq) para melhores características de desempenho do que a maioria dos outros meios de conversão.vec
,set
e geralmenteinto
são seus amigos para "converter" facilmente para outro tipo de coleção.Como você deseja transformar um vetor de mapas em um mapa de mapas? Você precisa de uma chave. Você pode fornecer uma amostra de entrada / saída esperada?
fonte
Para vetores, existe a
vec
funçãoPara sequências preguiçosas, existe a
lazy-seq
funçãoPara converter em conjuntos, existe a
set
funçãofonte
lazy-seq
vez deseq
apenas adicionar uma indireção inútil. Se você realmente deseja devolver algo não nulo, mesmo antes de uma coleção vazia, então hásequence
.lazy-seq
é uma construção de baixo nível.Mais uma resposta para a conversão de uma lista em um mapa (para fins de integridade) - a partir daqui :
fonte
Para converter um vetor em uma lista, você também pode usar
for
, desta forma:Quando você não quiser manipular os dados, basta usar
seq
no vetor:fonte
for
você pode simplesmente fazer(map identity [1 2 3 4])
Não há necessidade de converter um vetor em uma lista. Clojure tratará um vetor como trataria uma lista - como uma sequência - quando uma sequência é necessária. Por exemplo,
Se você precisa se certificar de que o vetor está sendo tratado como uma sequência, envolva-o em
seq
:Se você tem um vetor de mapas e deseja um conjunto de mapas, não importa se o vetor contém mapas. Você apenas converte o vetor em um conjunto, como de costume:
fonte