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 的新手。如果其他人有正确答案,我们非常欢迎。
此致
我是 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 的新手。如果其他人有正确答案,我们非常欢迎。
此致