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

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

Я обертываю java lib в clojure, но у меня проблемы с аргументами переменной длины. Скажем,

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

Как я могу назвать эту функцию в clojure?

4b9b3361

Ответ 1

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

Вы можете преобразовать Clojure seq (возможно, используя 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)))

Ответ 2

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

Итак, в Clojure вызов должен выглядеть примерно так:

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))

Ответ 3

(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))

Например,

(java.util.Arrays/asList (to-array '(1 2 3 4 5)))