Clojure Environ 将地图发送到 java

Clojure Environ sending map to java

我是 Clojure 的新手,我正在使用具有 leiningen + clojure + java 的应用程序 问题出在插件 lein-environ“1.0.0”上。

在应用程序中,它使用了很多 "env" 地图。通过读取 .lein_env 或 project.clj 中定义的现有值。但是在同一个应用程序中正在做一些:

(attach! :my-val (str (env :api-host) "/api/" (env :resource)))

如果我用 (println (env :my-val)) 打印这个值,我确实看到了内容。但是如果我尝试将它作为地图发送到 Java,我看不到这个值。我得到了先前定义的值。我的意思是从 .lein_env 开始的所有内容,但是 none 应用程序计算的值。

我还没有找到任何 api 或关于 attach! 函数的文档,所以老实说我不知道​​它的作用。但是由于值是从 env 中读取的,我认为它是将这些键附加到地图上。

我尝试在 clojure 中将 env 转换为 HashMap:

(defn- creat-env-hash-map []
    (java.util.HashMap. (env)))

但仍然得到相同的结果,这些值未映射。

我想知道我做错了什么,这是否可能。

非常感谢您的帮助。

编辑:

我调用java代码的方式是:

(println (com.my.package.HelperClass/staticMethod env))

java中的静态方法:

public static String staticMethod(HashMap<String, String> map) {
    String result = "";
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        result += pair.getKey() + " = " + pair.getValue() + "\n";
        it.remove(); // avoids a ConcurrentModificationException
    }
    return result;
}

好的,看起来 Clojure 的持久映射实现了 java.util.Map 但不是 java.util.HashMap。这意味着您的 Java 方法需要采用 Map<Object, Object>.

如果您需要 Java 中的 HashMap,您的 Java 方法可以将映射从 Clojure 传递到 HashMap 构造函数。

此方法是您实际使用的方法还是一种简化方法?

我没有正确理解 clojure 中的 "env"。 Environ 也将它作为一个函数,它是一种智能对象,当您像 (env :value) 一样调用它时会调用该函数,但并非所有值都被添加到同一个映射中。

Environ 具有这种上下文,其中包含您在执行时间中设置的一些值。

我最终做的是创建另一个地图,同时包含 "pre-defined" 值和

(defn- creat-env-hash-map []
(java.util.HashMap. (env)))

(defn- complete-hash-map []
    (doto (creat-env-hash-map)
        (.put "value-a" (str (env :value-a)))
        (.put "value-b" (str (env :value-b)))
))

我可能没有使用最好的方法,但正如我提到的,我是 clojure 的新手。如果其他人有正确答案,我们非常欢迎。

此致