Vergessen wir nicht, dass Sie mit Trusty Old into
alles seq
Mögliche (Liste, Vektor, Karte, Satz, sortierte Karte) und einen leeren Behälter, den Sie füllen möchten, nehmen und ablegen into
können.
(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
ist ein Wrapper conj
, der die Basisabstraktion zum Einfügen neuer Einträge in eine Sammlung basierend auf dem Typ der Sammlung darstellt. Das Prinzip, das diesen Fluss so schön macht, ist, dass Clojure auf komponierbaren Abstraktionen aufbaut , in diesem Fall into
über conj
der Sammlung und seq
.
Die obigen Beispiele lassen sich immer noch gut zusammensetzen, wenn der Empfänger zur Laufzeit übergeben wird: Da die zugrunde liegenden Abstraktionen ( seq
und conj
) für alle Sammlungen (und auch für viele Sammlungen von Java) implementiert sind, müssen sich die höheren Abstraktionen keine Sorgen machen über viele spezielle datenbezogene Eckfälle.
into
Anwendungenconj
, tun(into '() some-seq)
eine Liste erhalten , die das ist umgekehrt irgend-Seq, weilconj
conses auf Listen.into
Transienten (für die meisten Seq-Typen) für bessere Leistungseigenschaften als die meisten anderen Konvertierungsmittel verwendet werden.vec
,set
Und in der Regelinto
sind Ihre Freunde einfach „Convert“ in einer anderen Sammlung Typ.Wie möchten Sie einen Kartenvektor in eine Kartenkarte umwandeln? Sie benötigen einen Schlüssel. Können Sie die Beispieleingabe / erwartete Ausgabe verwenden?
quelle
Für Vektoren gibt es die
vec
FunktionFür faule Sequenzen gibt es die
lazy-seq
FunktionFür die Umwandlung in Mengen gibt es die
set
Funktionquelle
lazy-seq
anstattseq
nur eine nutzlose Indirektion hinzuzufügen. Wenn Sie wirklich etwas zurückgeben möchten, das nicht gleich Null ist, gibt es auch keine leeren Sammlungensequence
.lazy-seq
ist etwas von einem Low-Level-Konstrukt.Noch eine Antwort für die Konvertierung von einer Liste in eine Karte (der Vollständigkeit halber) - von hier aus :
quelle
Um einen Vektor in eine Liste zu konvertieren, können Sie auch Folgendes verwenden
for
:Wenn Sie die Daten nicht bearbeiten möchten, verwenden Sie einfach
seq
den Vektor:quelle
for
könnten Sie einfach tun(map identity [1 2 3 4])
Es ist nicht erforderlich , einen Vektor in eine Liste zu konvertieren . Clojure behandelt einen Vektor wie eine Liste - als Sequenz -, wenn eine Sequenz erforderlich ist. Beispielsweise,
Wenn Sie sicherstellen müssen, dass der Vektor als Sequenz behandelt wird, wickeln Sie ihn ein in
seq
:Wenn Sie einen Kartenvektor haben und eine Reihe von Karten möchten, spielt es keine Rolle, dass der Vektor Karten enthält. Sie konvertieren den Vektor einfach wie gewohnt in eine Menge:
quelle