Clojure环境将映射发送到java

Clojure环境将映射发送到java,java,clojure,leiningen,environ,Java,Clojure,Leiningen,Environ,我是Clojure新手,正在使用一个具有leiningen+Clojure+java的应用程序 问题在于插件lein environ“1.0.0” 在应用程序中,它大量使用“环境”地图。通过读取.lein_env或project.clj中定义的现有值。但在同一应用程序中,正在执行以下操作: (附加!:我的val(str(env:api-host)“/api/(env:resource))) 如果我用(println(env:my val))打印此值,我确实看到了内容。但是如果我尝试将它作为映射发

我是Clojure新手,正在使用一个具有leiningen+Clojure+java的应用程序 问题在于插件lein environ“1.0.0”

在应用程序中,它大量使用“环境”地图。通过读取.lein_env或project.clj中定义的现有值。但在同一应用程序中,正在执行以下操作:

(附加!:我的val(str(env:api-host)“/api/(env:resource)))

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

我还没有找到任何关于
附件的api或文档函数,所以说实话,我不知道它是做什么的。但是由于这些值是从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;
}
publicstaticstringstaticmethod(HashMap){
字符串结果=”;
迭代器it=map.entrySet().Iterator();
while(it.hasNext()){
Map.Entry对=(Map.Entry)it.next();
结果+=pair.getKey()+“=”+pair.getValue()+“\n”;
it.remove();//避免ConcurrentModificationException
}
返回结果;
}

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

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


这个方法是您正在使用的实际方法还是简化方法?

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

Environ有这样一个上下文,它承载一些您在执行时设置的值

我最终做的是创建另一个地图,其中包含“预定义”值和

(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的新手。如果其他人有正确的答案是非常受欢迎的


当你说“我试图把它作为地图发送到Java”时,你在做什么?你能发布那行代码吗?你可能不需要转换,clojure
{}
已经是java HashMap了。@Noises是的,你是对的,我尝试转换只是为了确认我没有遗漏什么,感谢您确认这是一个HashMapalready@BenC我在编辑后添加了一个简单的交互示例:正如我之前提到的,我是clojure新手,可能还缺少一些基本的东西。所以我得到了一张地图,并将对象转换为字符串。让我试试。