Давайте не будем забывать, что верный старый into
позволяет вам взять что-нибудь seq
способное (список, вектор, карта, набор, отсортированная карта) и пустой контейнер, который вы хотите заполнить, и поместить его 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
- это обертка вокруг conj
, которая является базовой абстракцией для соответствующей вставки новых записей в коллекцию в зависимости от типа коллекции. Принцип, который делает этот поток таким приятным, заключается в том, что Clojure построен на составных абстракциях , в данном случае into
поверх conj
поверх коллекции и seq
.
Приведенные выше примеры все равно будут хорошо составлены, если получатель будет передан во время выполнения: поскольку базовые абстракции (seq
и conj
) реализованы для всех коллекций (и многих из коллекций Java также), поэтому старшие абстракции не должны беспокоиться о множестве особых случаев, связанных с данными.