Как обрабатывать аргументы переменной длины 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)))