1
votes

Comment utiliser java.util.stream.Stream dans Clojure?

stream
#object[java.util.stream.ReferencePipeline$Head 0x50129b8f
"java.util.stream.ReferencePipeline$Head@50129b8f"]

0 commentaires

3 Réponses :


5
votes

Faites la même chose que vous feriez en java. Appelez-y des méthodes d'interopérabilité, comme (.map stream ...) , ou quoi que ce soit d'autre, et rassemblez-le dans une liste à la fin, ou réduisez-la, ou tout ce que vous devez faire.

Les fonctions Clojure n'implémentent pas les interfaces attendues par un flux, telles que java.util.function.Function, vous devrez donc utiliser reify au lieu d'un simple fn :

< pré> XXX


2 commentaires

Je ne sais pas comment cela est censé fonctionner. (def test (.map stream (reify java.util.function.Function (apply [this x] (println x))))) (take 1 test) Erreur lors de l'impression de la valeur de retour (IllegalArgumentException) à clojure.lang.RT / seqFrom (RT.java:557). Je ne sais pas comment créer ISeq à partir de: java.util.stream.ReferencePipeline $ 3


Un flux java n'est pas une séquence de clojure, et vous ne pouvez donc pas appeler des fonctions de séquence de clojure dessus. C'est aussi vrai pour (.map stream f) que pour simplement stream .



1
votes

Vous pouvez consulter une bibliothèque appelée ike.cljj pour quelques subtilités d'interopérabilité.


0 commentaires

1
votes

Je voulais parcourir le stream Java / style impératif pour éviter de faire exploser le tas. Je n'ai pas besoin de réduire sur le flux, je dois traiter chaque ligne et retirer un champ et l'envoyer. Je pense que pour cela, je ferais probablement mieux de doseq.

(doseq 
  [l (iterator-seq (.iterator stream))] 
    (println l))


0 commentaires