Как обрабатывать аргументы переменной длины Java в clojure?

Я оборачиваю Java-библиотеку в clojure, но у меня проблемы с аргументами переменной длины. Сказать,

TestClass.aStaticFunction(Integer... intList){/*....*/}

Как я могу вызвать эту функцию в ближайшем будущем?

3 ответа

Решение

Поскольку Java varargs на самом деле являются массивами, вы можете вызывать функции vararg в Clojure, передавая массив.

Вы могли бы преобразовать seq Clojure (возможно, используя различные функции переменных аргументов Clojure) в массив:

 (TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)]))

или же

(defn a-static-function-wrapper [& args]
  (TestClass/aStaticFunction (into-array Integer args))

Или сделайте массив и установите его индексы вручную

(TestClass/aStaticFunction (doto (make-array Integer 3)
                              (aset 0 first-element)
                              (aset 1 second-element)
                              (aset 2 third-element)))

Аргументы переменной длины Java на самом деле хотят массив в качестве входных данных.

Так что в Clojure вызов должен быть примерно таким:

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))
(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))

Например,

(java.util.Arrays/asList (to-array '(1 2 3 4 5)))
Другие вопросы по тегам