将HashMap转换为Clojure映射不会像java调用那样执行

时间:2011-01-27 11:32:02

标签: java clojure hashmap

我对Clojure很新。我想将List<HashMap<String,String>>传递给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));
    }
}

Clojure代码

(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

我为第三个println排除了返回字符串“int”。 在第四个println中,显然HashMap没有正确转换为Clojure映射。你能帮助成功转换怎么做? (我知道我可以使用HashMap的get()函数,但能够将它用作Clojure映射会更舒服)

2 个答案:

答案 0 :(得分:1)

我看到两个问题:

  • 你的转换函数返回nil,因为println是最后一个语句,返回nil
  • “:type”是一个Clojure关键字,它不等于字符串键“type” - 因此查找无法找到您想要的值

答案 1 :(得分:0)

我现在更了解,这是在问一个愚蠢的事情。 对不起,但我的印象是,在Clojure中,以下两个结构是一致的。 {"a" 1, "b" 2, "c" 3}{:a 1, :b 2, :c 3}他们不是,我尝试使用错误的方法从地图中获取数据。 我尝试使用(println ((into {} (first columns)) "pos")),它工作正常。 我很抱歉没有早点意识到这一点。

但是,如果我可以再问一次。它们之间真正的区别是什么?现在我对此只有一个模糊的想法。