Conversión de estructuras de datos Clojure a colecciones Java
data-structures collections (1)
¿Cuál es la forma idiomática de Clojure para convertir una estructura de datos en una colección de Java, específicamente?
-
[]
ajava.util.ArrayList
-
{}
ajava.util.HashMap
-
#{}
a unjava.util.HashSet
-
()
ajava.util.LinkedList
¿Hay una biblioteca clojure.contrib para hacer esto?
CASO DE USO : para facilitar Clojure en mi organización, estoy considerando escribir un conjunto de pruebas unitarias para un servidor REST totalmente Java en Clojure. Escribí parte de la suite en Scala, pero creo que Clojure podría ser mejor porque el soporte macro reducirá mucho el código repetitivo (necesito probar docenas de llamadas de servicio REST similares).
Estoy usando EasyMock para burlar las conexiones a la base de datos (¿hay una forma mejor?) Y mis métodos falsificados deben devolver elementos java.util.List<java.util.Map<String, Object>>
(que representan conjuntos de filas de bases de datos) a los llamantes . Pasaría en una estructura de [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...]
a mi simulación y la convertiría a la requerida Colección Java para que pueda devolverse a la persona que llama en el formato esperado.
Clojure vector, set y list classes implementan la interfaz java.util.Collection
y ArrayList
, HashSet
y LinkedList
pueden tomar un argumento de constructor java.util.Collection
. Entonces puedes simplemente hacer:
user=> (java.util.ArrayList. [1 2 3])
#<ArrayList [1, 2, 3]>
user=> (.get (java.util.ArrayList. [1 2 3]) 0)
1
Del mismo modo, la clase de mapa Clojure implementa la interfaz java.util.Map
y HashMap
toma un argumento de constructor java.util.Map
. Asi que:
user=> (java.util.HashMap. {"a" 1 "b" 2})
#<HashMap {b=2, a=1}>
user=> (.get (java.util.HashMap. {"a" 1 "b" 2}) "a")
1
También puedes hacer lo inverso y es mucho más fácil:
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}