N'oublions pas que trusty old into
vous permet de prendre tout ce qui est seq
capable (liste, vecteur, carte, ensemble, carte triée) et un conteneur vide que vous voulez remplir, et le met 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
est un wrapper autour conj
, qui est l'abstraction de base pour insérer de nouvelles entrées de manière appropriée dans une collection en fonction du type de la collection. Le principe qui fait de ce flux est donc bien que Clojure est construit sur des abstractions composables , dans ce cas , into
au - dessus de conj
au - dessus de la collecte et seq
.
Les exemples ci-dessus seraient toujours bien composés si le destinataire était passé au moment de l'exécution: parce que les abstractions sous-jacentes ( seq
et conj
) sont implémentées pour toutes les collections (et de nombreuses collections Java également), donc les abstractions supérieures n'ont pas à s'inquiéter à propos de nombreux cas particuliers liés aux données.
into
usesconj
, faire(into '() some-seq)
donnera une liste qui est l' inverse de some-seq, parce queconj
consés sur des listes.into
utilise des transitoires (pour la plupart des types de seq) pour de meilleures caractéristiques de performance que la plupart des autres moyens de conversion.vec
,set
etinto
sont généralement vos amis pour "convertir" facilement en un autre type de collection.Comment voulez-vous transformer un vecteur de cartes en une carte de cartes? Vous avez besoin d'une clé, pouvez-vous fournir une utilisation avec un exemple d'entrée / sortie attendue?
la source
Pour les vecteurs, il y a la
vec
fonctionPour les séquences paresseuses, il y a la
lazy-seq
fonctionPour convertir en ensembles, il y a la
set
fonctionla source
lazy-seq
au lieu d'seq
ajouter simplement une indirection inutile. Si vraiment vous voulez retourner quelque chose de non nul, même avant une collection vide, alors il y asequence
.lazy-seq
est en quelque sorte une construction de bas niveau.Une autre réponse pour la conversion d'une liste à une carte (par souci d'exhaustivité) - à partir d' ici :
la source
Pour convertir un vecteur en liste, vous pouvez également utiliser
for
, comme ceci:Lorsque vous ne souhaitez pas manipuler les données, utilisez simplement
seq
sur le vecteur:la source
for
vous pourriez juste faire(map identity [1 2 3 4])
Il n'est pas nécessaire de convertir un vecteur en liste. Clojure traitera un vecteur comme il traiterait une liste - comme une séquence - lorsqu'une séquence est requise. Par exemple,
Si vous devez vous assurer que le vecteur est traité comme une séquence, enveloppez-le dans
seq
:Si vous avez un vecteur de cartes et que vous voulez un ensemble de cartes, peu importe que le vecteur contienne des cartes. Vous convertissez simplement le vecteur en un ensemble comme d'habitude:
la source