将HashMap转换为Clojure map执行的操作与java调用不一样

将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很陌生。我想将
列表
传递给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