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.