Подтвердить что ты не робот

Преобразование структур данных Clojure в коллекции Java

Что такое Clojure -идиоматический способ преобразования структуры данных в коллекцию Java, в частности:

  • [] до java.util.ArrayList
  • {} до java.util.HashMap
  • #{} до java.util.HashSet
  • () до java.util.LinkedList

Есть ли библиотека clojure.contrib для этого?

ИСПОЛЬЗОВАТЬ CASE. Чтобы облегчить Clojure в моей организации, я рассматриваю возможность написания пакета unit-test для сервера все-Java REST в clojure. Я написал часть пакета в Scala, но думаю, что Clojure может быть лучше, потому что поддержка макроса уменьшит количество кода шаблона (мне нужно протестировать десятки подобных вызовов службы REST).

Я использую EasyMock для подделки соединений с базой данных (есть ли лучший способ?), и мои издеваемые методы должны возвращать java.util.List<java.util.Map<String, Object>> элементы (представляющие набор наборов баз данных) для вызывающих. Я передал бы в структуру [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...] свой макет и преобразовал бы его в требуемую коллекцию Java, чтобы она могла быть возвращена вызывающему в ожидаемом формате.

4b9b3361

Ответ 1

Clojure классы вектора, набора и списка реализуют интерфейс java.util.Collection, а ArrayList, HashSet и LinkedList могут принимать аргумент конструктора java.util.Collection. Поэтому вы можете просто:

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

Аналогично, класс Clojure реализует интерфейс java.util.Map и HashMap принимает аргумент конструктора java.util.Map. Итак:

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

Вы также можете сделать обратное, и это намного проще:

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}