Преобразование структур данных Clojure в коллекции Java - PullRequest
39 голосов
/ 30 ноября 2010

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

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

Существует ли библиотека clojure.contrib для этого?

ИСПОЛЬЗОВАНИЕ CASE : Чтобы упростить Clojure в своей организации, я планирую написать пакет модульных тестов для полностью 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, чтобы она могла быть возвращена вызывающей стороне в ожидаемом формате.

1 Ответ

67 голосов
/ 30 ноября 2010

Классы векторов Clojure, set и list реализуют интерфейс 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...