将HashMap转换为Clojure map执行的操作与java调用不一样
我对Clojure很陌生。我想将将HashMap转换为Clojure map执行的操作与java调用不一样,java,clojure,hashmap,Java,Clojure,Hashmap,我对Clojure很陌生。我想将列表传递给Clojure函数,在该函数中我想使用内部HashMaps作为常规Clojure映射,但我无法使用:key函数从映射中获取值(这对于常规Clojure映射很好),我使用了into{}函数,但它没有生成我要生成的值。我做错了什么? (注意:这是一个演示测试代码,仅用于查看行为) Java代码: package com.experimental.clojure.java; import java.util.ArrayList; import java.ut
列表
传递给Clojure函数,在该函数中我想使用内部HashMaps作为常规Clojure映射,但我无法使用:key函数从映射中获取值(这对于常规Clojure映射很好),我使用了into{}函数,但它没有生成我要生成的值。我做错了什么?
(注意:这是一个演示测试代码,仅用于查看行为)
Java代码:
package com.experimental.clojure.java;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.experimental.clojure.test.ConvertTest;
public class Test_Cloj_Convert {
public static void main(String[] args) {
List<Map<String, String>> columns = new ArrayList<Map<String, String>>();
Map<String, String> col1 = new HashMap<String, String>();
col1.put("name", "ID");
col1.put("type", "int");
col1.put("pos", "0");
Map<String, String> col2 = new HashMap<String, String>();
col2.put("name", "Name");
col2.put("type", "string");
col2.put("pos", "2");
Map<String, String> col3 = new HashMap<String, String>();
col3.put("name", "Description");
col3.put("type", "enum");
col3.put("pos", "1");
columns.add(col1);
columns.add(col2);
columns.add(col3);
ConvertTest scripter = new ConvertTest();
System.out.println(scripter.conv(columns));
}
}
以及(令人惊讶的)产出
#
#
无
{name ID,type int,pos 0}
无
无效的
第三个println的例外是返回字符串“int”。
在第四个println中,很明显HashMap没有正确地转换为Clojure映射。你能帮我做些什么来成功转换吗?(我知道我可以使用HashMap的get()函数,但将其用作Clojure映射会更舒服)我看到了两个问题:
- conv函数返回nil,因为println是最后一条语句,它返回nil
- “:type”是Clojure关键字,它不等于字符串键“type”-因此查找无法找到所需的值
- 我现在更明白了,它问的是一件愚蠢的事情。
很抱歉,但我的印象是,在Clojure中,以下两种结构是相同的。
{“a”1,“b”2,“c”3}
和{:a 1,:b 2,:c 3}
它们不是,我试图使用错误的方法从地图中获取数据。
我尝试使用(println((进入{}(第一列))“pos”)
,效果很好。
我很抱歉没有早点意识到这一点
不过,请允许我再问一次。他们之间的真正区别是什么?现在我对此只有一个模糊的概念。我理解最后一个空值。没问题。我不知道:像这样的类型是一个关键字,所以我尝试了相同的例子来读取key:name或:pos。结果是一样的。因此,除非它们也是保留词,否则这不是一个好的解释。(如果不能使用特定的单词作为名称或类型作为映射的键,那将是很奇怪的)。(时间限制到了)问题3,对我来说,(println(into{}(first columns)))行返回的{name ID,type int,pos 0}结构并不是一个常规映射,这一点很重要和:a在语义上有一些不同,但大多数时候可以交换。因此,关键字通常用于映射中的关键字,因为它们具有更快的查找时间(例如,对compair来说,js只有字符串,这限制了性能),关键字实现IFn,因此可以用作函数来查找自己(:bla{:bla 5})将返回5。字符串的情况并非如此。关键字也具有最佳名称空间::带有名称空间的关键字(不经常使用)。如果你标记了一些东西,比如说你分类了大小:大:小:小。这可能很有用:
(name:hello);=>“你好”
(ns com.experimental.clojure.test.ConvertTest
(:gen-class
:name com.experimental.clojure.test.ConvertTest
:methods [
[conv [java.util.List] String]
])
(:import [java.util List] [java.util HashMap])
)
(defn conv
[columns]
(println columns)
(println (first columns))
(println (:type (first columns)))
(println (into {} (first columns)))
(println (:type (into {} (first columns))))
)
(defn -conv
[this columns]
(conv columns)
)
#<ArrayList [{name=ID, type=int, pos=0}, {name=Name, type=string, pos=2}, {name=Description, type=enum, pos=1}]>
#<HashMap {name=ID, type=int, pos=0}>
nil
{name ID, type int, pos 0}
nil
null