Я хотел бы реализовать наивный неленивый map
в Java с циклом Java. Меня больше всего беспокоит вызов функций в java из Clojure.
Вот мой код:
Класс под названием NaiveClojure для реализации функций с использованием Java.
package java_utils;
import java_utils.ApplyFn;
public class NaiveClojure {
public static Object[] map (ApplyFn applyfn, Object function, Object[] coll) {
int len = coll.length;
for (int i = 0 ; i < len ; i++) {
coll[i] = applyfn.apply(function, coll[i]);
}
return coll;
}
}
Абстрактный класс с именем ApplyFn
package java_utils;
public abstract class ApplyFn {
public abstract Object apply (Object function, Object value);
}
Итак, в Clojure у меня есть
(defn java-map [f coll]
(let [java-fn (proxy [ApplyFn] []
(apply [f x]
(f x)))]
(seq (NaiveClojure/map java-fn f (to-array coll)))))
Я старался
(doall (map inc (range 0 10000))) ;; 3.4 seconds for 10000 operations
(java-map inc (range 0 10000) ;; 5.4 seconds
Моя цель не в том, чтобы превзойти map
(я реализовал это в качестве примера), я просто хочу делать такие вещи с конкретными функциями (а не изобретать велосипед Clojure).
Есть ли лучший способ передать такие функции? (как простой и быстрый способ) И чтобы улучшить мой код в целом (у меня плохие теоретические знания), вы знаете, что здесь убивает производительность? Я бы сказал, что общий ввод типа Object, но я не вижу ничего другого
Спасибо