簡體   English   中英

將HashMap轉換為Clojure映射的行為與Java調用不同

[英]Converting a HashMap into Clojure map performs not as excepted from a java call

我對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映射會更舒適)

我看到兩個問題:

  • 您的conv函數返回nil,因為println是最后一條語句,並且返回nil
  • “:type”是Clojure關鍵字,它不等於字符串鍵“ type”-因此,查找無法找到所需的值

我現在了解得更多,這是在問一個愚蠢的事情。 抱歉,但我給人的印象是,在Clojure中,以下兩個結構是相同的。 {"a" 1, "b" 2, "c" 3}{:a 1, :b 2, :c 3}它們不是,我嘗試使用錯誤的方法從地圖中獲取數據。 我嘗試使用(println ((into {} (first columns)) "pos")) ,它工作正常。 抱歉,您未及早意識到這一點。

但是,我是否可以再問一次。 它們之間的真正區別是什么? 現在,我對此只有一個模糊的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM