40 votes

Conversion des structures de données Clojure en collections Java

Quelle est la méthode idiomatique de Clojure pour convertir une structure de données en une collection Java, en particulier :

  • [] à un java.util.ArrayList
  • {} à un java.util.HashMap
  • #{} à un java.util.HashSet
  • () à un java.util.LinkedList

Existe-t-il une bibliothèque clojure.contrib pour faire cela ?

CAS D'UTILISATION : Afin de faciliter l'intégration de Clojure dans mon organisation, j'envisage d'écrire une suite de tests unitaires pour un serveur REST tout-Java en Clojure. J'ai écrit une partie de la suite en Scala, mais je pense que Clojure est peut-être meilleur car le support des macros réduira une grande partie du code passe-partout (je dois tester des dizaines d'appels de services REST similaires).

J'utilise EasyMock pour simuler les connexions à la base de données (existe-t-il une meilleure méthode ?) et mes méthodes simulées doivent retourner les données suivantes java.util.List<java.util.Map<String, Object>> (représentant les ensembles de lignes de la base de données) aux appelants. Je passerais dans un [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...] à mon objet fantaisie et la convertir en collection Java requise afin qu'elle puisse être renvoyée à l'appelant dans le format attendu.

70voto

Abhinav Sarkar Points 10904

Les classes de vecteurs, d'ensembles et de listes de Clojure implémentent la fonction java.util.Collection et l'interface ArrayList , HashSet et LinkedList peut prendre un java.util.Collection argument du constructeur. Vous pouvez donc simplement faire :

user=> (java.util.ArrayList. [1 2 3])
#<ArrayList [1, 2, 3]>
user=> (.get (java.util.ArrayList. [1 2 3]) 0)
1

De même, la classe map de Clojure implémente java.util.Map et l'interface HashMap prend un java.util.Map argument du constructeur. Donc :

user=> (java.util.HashMap. {"a" 1 "b" 2})
#<HashMap {b=2, a=1}>
user=> (.get (java.util.HashMap. {"a" 1 "b" 2}) "a")
1

Vous pouvez aussi faire l'inverse et c'est beaucoup plus facile :

ser=> (into [] (java.util.ArrayList. [1 2 3]))
[1 2 3]
user=> (into #{} (java.util.HashSet. #{1 2 3}))
#{1 2 3}
user=> (into '() (java.util.LinkedList. '(1 2 3)))
(3 2 1)
user=> (into {} (java.util.HashMap. {:a 1 :b 2}))
{:b 2, :a 1}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X