Ich verwende eine Java-Klasse, die eine Folge von Ergebnissen darstellt (etwa wie ein Clojure-Vektor).
Ich möchte diese Klasse mit den typischen Clojure-Sequenzfunktionen verwenden (dh ich möchte, dass die Klasse sich so verhält, als würde sie die Sequenzabstraktion unterstützen), aber ich kann die Klasse nicht ändern unfähig, clojure.lang.Seqable
oder ähnliches zu implementieren. Ärgerlicherweise implementiert die Klasse auch nicht java.util.Collection
oder java.lang.Iterable
.
Ich kann ein paar Optionen sehen:
iterator-seq
für den (vorhandenen) Iterator des Objekts. java.util.Collection
/ clojure.lang.Sequable
implementiert.
Gibt es noch andere Möglichkeiten? Was ist der beste Ansatz?
Am schnellsten und einfachsten wäre es, iterator-seq
zu verwenden.
Das wirft die Frage auf: Warum stellt Core Clojure kein Protokoll wie SeqSource zur Verfügung, das von seq
aufgerufen würde? Dann könnten Nicht-Standard-Sammlungen "erweitert" werden, um einen Seq zu liefern, ähnlich wie der InterneReduce für reduce
funktioniert.
Verwenden Sie proxy
, um die Klasse zu erweitern und um% zu implementieren. co_de%
Mein erster Screenshot wäre die Erstellung eines Lazy-seq des Objekts:
%Vor% Ersetzen Sie einfach .size
und .get
durch geeignete Methoden.
Das Schreiben eines Wrappers ist möglicherweise sinnvoller, wenn Sie die Leistung im Vergleich zu lazy-seq
solution verbessern möchten.
Tags und Links java clojure sequence clojure-java-interop